O shebang é sempre o mesmo que o diretório de instalação do interpretador?

1

O cabeçalho shebang deve sempre corresponder ao diretório de instalação do intérprete? Se sim, então por que #!/usr/bin/python e #!/usr/local/bin/python funcionam para mim?

    
por Avi Mehenwal 27.02.2013 / 22:05

3 respostas

7

Como outros observaram, a linha shebang deve se referir a um arquivo real que existe.

Como sistemas diferentes podem ter binários instalados em locais diferentes, isso é uma fraqueza da portabilidade de scripts.

Uma maneira de resolver isso é com links, como outros já mencionaram.

Outra maneira é editar o script para se referir ao caminho certo em seu sistema.

Mais uma maneira de contornar isso é usar /usr/bin/env , que encontrará o executável em seu PATH.

Então, em vez de:

#!/usr/bin/python

Escreva:

#!/usr/bin/env python

Dessa forma, as pessoas só precisam vincular /usr/bin/env se necessário, em vez de cada executável individual.

É claro que o executável ainda precisa estar no seu PATH para que isso funcione ...

Como você pode ver, não há solução 100% limpa. Lembre-se: "Pior é melhor" (:

    
por 27.02.2013 / 22:35
5

A linha #! (shebang) deve especificar um executável que realmente existe. Se ambos funcionarem no seu sistema, significa que você tem um python instalado em ambos os lugares. Ou, possivelmente, um link simbólico.

Normalmente, você receberia um erro ao tentar usar um intérprete que não existe:

anthony@Zia:~$ /tmp/test 
bash: /tmp/test: /usr/local/bin/python: bad interpreter: No such file or directory

Se você executar o script dessa forma, o caminho provavelmente não importará:

anthony@Zia:~$ python /tmp/test
anthony@Zia:~$ 

Isso porque você está executando python diretamente e passando um argumento. O Python decide então abrir esse arquivo e tratá-lo como um script. No primeiro caso, o kernel está tentando executar o script como um executável. Ele verifica, nota a linha shebang e tenta convertê-lo para o segundo formulário, para que ele possa ser executado. Isso falhará se o caminho fornecido após #! não existir realmente.

    
por 27.02.2013 / 22:21
3

Shebang é uma combinação dos seguintes caracteres: #! quando aparece na primeira linha do script. A string a seguir é sempre o caminho para o interpretador. Eu verifico o que exatamente são /usr/bin/python e /usr/local/bin/python . É possível que um deles seja um link simbólico para o outro. Você poderia, por favor, fornecer a saída dos seguintes comandos:

  • ls -l /usr/bin/python
  • ls -l /usr/local/bin/python
por 27.02.2013 / 22:24