Como você especifica intérpretes de script alternativos (shebangs)?

7

Em um arquivo executável, você especifica o ambiente usando um shebang:

#!/usr/bin/env ruby

# ruby code here

Mas e se você quiser especificar vários ambientes possíveis? Por exemplo, se você tem várias versões do Ruby instaladas, você pode querer fazer algo como

#!/path/to/better/ruby/version
#!/path/to/alternative/ruby/version

# ruby code here

Como você pode especificar vários ambientes possíveis para um único arquivo executável?

    
por sffc 15.08.2012 / 12:56

2 respostas

5

A resposta curta é que você não pode.

A idéia por trás de usar #!/usr/bin/env ruby ao invés de simplesmente #!/usr/bin/ruby é usar qualquer binário rubi primeiro no caminho do usuário. Então o seu script não depende do ruby estar no mesmo lugar em todos os sistemas; afinal, um local ruby 'normal' pode ser /usr/bin/ruby , /usr/local/bin/ruby , /opt/ruby-1.8.7/bin/ruby , etc ...

Se você quisesse codificar alguns valores ou fazer alguma lógica de pesquisa, sempre poderia criar um script de shell de wrapper:

#!/bin/sh

for ruby in /usr/bin/ruby /usr/local/bin/ruby
do
    if [ -x "$ruby" ]
    then
        "$ruby" myscript.rb
        break
    fi
done

E se você está suficientemente motivado, você pode até mesmo incorporar um script ruby (ou outro) dentro do shell roteiro.

    
por 15.08.2012 / 14:07
1

Eu vou contradizer o mrb e dizer que você pode fazer alternativas, sem mudar o "#!" linha.

Suponha que você tenha um script ruby com #!/usr/bin/env ruby como a primeira linha.

Você quer que /path/to/better/ruby/version/whatever execute o script, você define a variável de ambiente PATH para ter /path/to/better/ruby/version primeiro:

PATH=/path/to/better/ruby/version:$PATH  whatever_script_name_is

Você quer que /usr/local/bin/ruby execute o script? Definir o PATH adequadamente:

PATH=/usr/local/bin:$PATH  whatever_script_name_is

Observe que mexer com o PATH pode causar outros problemas, caso o executável do ruby que você deseja executar o script resida no mesmo diretório com outros programas alternativos. Por exemplo, se /usr/local/bin tiver BSD cat , grep , sed , assim como ruby , quando você definir PATH=/usr/local/bin:$PATH , obterá os executáveis BSD em vez dos executáveis Linux. Isso poderia causar um problema.

    
por 15.08.2012 / 17:17

Tags