Não é necessariamente melhor.
A vantagem de #!/usr/bin/env python
é que ele usará qualquer executável python
aparece primeiro no usuário $PATH
.
A desvantagem de #!/usr/bin/env python
é que ele usará qualquer executável python
aparece primeiro no usuário $PATH
.
Isso significa que o script pode se comportar de maneira diferente dependendo de quem o executa. Para um usuário, ele pode usar o /usr/bin/python
que foi instalado com o sistema operacional. Por outro lado, pode usar um /home/phred/bin/python
experimental que não funciona corretamente.
E se python
for instalado apenas em /usr/local/bin
, um usuário que não tenha /usr/local/bin
em $PATH
nem poderá executar o script. (Isso provavelmente não é muito provável nos sistemas modernos, mas pode facilmente acontecer com um intérprete mais obscuro.)
Especificando #!/usr/bin/python
você especifica exatamente qual interpretador será usado para executar o script em um sistema particular .
Outro problema em potencial é que o truque #!/usr/bin/env
não permite que você passe argumentos para o intrepreter (diferente do nome do script, que é passado implicitamente). Isso geralmente não é um problema, mas pode ser. Muitos scripts Perl são gravados com #!/usr/bin/perl -w
, mas use warnings;
é a substituição recomendada nos dias de hoje. Os scripts Csh devem usar #!/bin/csh -f
- mas os scripts csh são não recomendados no primeiro lugar. Mas poderia haver outros exemplos.
Eu tenho vários scripts Perl em um sistema de controle de código pessoal que eu instalo quando configuro uma conta em um novo sistema. Eu uso um script de instalador que modifica a linha #!
de cada script à medida que é instalado no meu $HOME/bin
. (Eu não tive que usar nada além de #!/usr/bin/perl
ultimamente; ele volta a tempos em que o Perl geralmente não era instalado por padrão).
Um ponto menor: o truque #!/usr/bin/env
é possivelmente um abuso do comando env
, que foi originalmente planejado (como o nome indica) para invocar um comando com um ambiente alterado. Além disso, alguns sistemas mais antigos (incluindo o SunOS 4, se bem me lembro) não tinham o comando env
em /usr/bin
. Nenhum destes é provável que seja uma preocupação significativa. env
funciona assim, muitos scripts usam o truque #!/usr/bin/env
, e os provedores do sistema operacional provavelmente não farão nada para quebrá-lo. Pode ser um problema se você quiser que seu script seja executado em um sistema realmente antigo, mas é provável que você precise modificá-lo de qualquer maneira.
Outra possível questão (graças a Sopalajo de Arrierez por apontá-la nos comentários) é que as tarefas agendadas são executadas com um ambiente restrito. Em particular, $PATH
é tipicamente algo como /usr/bin:/bin
. Portanto, se o diretório que contém o interpretador não estiver em um desses diretórios, mesmo que esteja em seu $PATH
padrão em um shell de usuário, o truque /usr/bin/env
não funcionará. Você pode especificar o caminho exato, ou você pode adicionar uma linha ao seu crontab para definir $PATH
( man 5 crontab
para detalhes).