Usando env no shebang de um script
Os scripts em Python não são diferentes dos scripts em nenhum outro idioma.
O uso de #!/usr/bin/env python
ou #!/usr/bin/python
desempenha um papel se o script for executável e chamado sem o idioma anterior. O script chama o interpretador da linguagem para executar o código dentro do script, e o shebang é o "guia" para encontrar, no seu exemplo, python
.
Usando #!/usr/bin/env python
em vez do absoluto (caminho completo) #!/usr/bin/python
garante que o python (ou o interpretador de qualquer outro idioma) seja encontrado, caso ele não esteja exatamente no mesmo local em diferentes tipos de Linux ou Unix distribuições, como explicado, por exemplo aqui .
Embora #!/usr/bin/python
funcione em um sistema padrão do Ubuntu, é uma boa prática usar #!/usr/bin/env python
.
Sobre env
env
é um executável em /usr/bin
, ou /usr/bin to env
, em praticamente todas as distribuições Linux.
Da Wikipédia :
env é um comando shell para sistemas operacionais Unix e Unix-like. Ele é usado para imprimir uma lista de variáveis de ambiente ou executar outro utilitário em um ambiente alterado sem precisar modificar o ambiente existente no momento. Usando env, as variáveis podem ser adicionadas ou removidas, e as variáveis existentes podem ser alteradas, atribuindo novos valores a elas.
e em relação à sua pergunta:
Na prática, env tem outro uso comum. É frequentemente usado por scripts de shell para iniciar o interpretador correto. Neste uso, o ambiente normalmente não é alterado
Mais sobre env
encontra-se aqui e, como sempre, em man env
(de um terminal).
Informações adicionais sobre o shebang; porque não funciona o #! python?
Em um comentário, foi perguntado por que não podemos simplesmente usar #!python
como shebang. Como o intérprete está em $PATH
, a ideia é compreensível.
O motivo é que um executável é executado por execve
, pois podemos ler aqui . Especificamente as linhas:
Um script de intérprete é um arquivo de texto que tem permissão de execução ativada e cuja primeira linha é da forma:
#! interpreter [optional-arg]
O interpretador deve ser um caminho válido para um executável ....
explique que execve
exige um caminho completo (válido) para o interpretador. Isso faz sentido, pois os scripts (em qualquer idioma) podem, por exemplo ser executado a qualquer momento durante a inicialização também, possivelmente antes de $PATH
ser definido.