A linha shebang (de “sharp bang”, ou seja, #! ) é processada pela núcleo. O kernel não quer saber sobre variáveis de ambiente como PATH . Portanto, o nome na linha shebang deve ser um caminho absoluto para um executável. Você também pode especificar um argumento adicional para passar para esse executável antes do nome do script (com restrições dependentes do sistema não entrarei aqui). Por exemplo, para um script Python, você pode especificar
#!/usr/bin/python
na primeira linha, e quando você executar o script, o kernel executará /usr/bin/python /path/to/script . Mas isso não é conveniente: você precisa especificar o caminho completo do comando. E se você tiver python em /usr/bin em algumas máquinas e /usr/local/bin em outras? Ou você deseja definir seu PATH para /home/joe/opt/python-2.5/bin para usar uma versão específica do Python? Como o kernel não fará a consulta PATH para você, a idéia é fazer com que o kernel execute um comando que procura o interpretador desejado no PATH :
#!/fixed/path/to/path-lookup-command python
Esse path-lookup-command deve ter o nome de um executável como um argumento e procurá-lo em PATH e executá-lo: o kernel executará /fixed/path/to/path-lookup-command python /path/to/script . Por acaso, o comando env faz exatamente isso. Seu principal objetivo é executar um comando com um ambiente diferente, mas, como ele procura o nome do comando em $PATH , é perfeito para nosso propósito aqui.
Embora isso não seja oficialmente garantido, os sistemas históricos Unix forneceram
env em
/usr/bin , e os sistemas modernos mantiveram essa localização precisamente devido ao uso generalizado de
#!/usr/bin/env . Então, na prática, a maneira de especificar que um script deve ser executado pelo interpretador Python favorito do usuário é
#!/usr/bin/env python