Não é necessariamente melhor.
A vantagem #!/usr/bin/env python
é que ele usará o python
executável que aparecer primeiro no usuário $PATH
.
A desvantagem de #!/usr/bin/env python
é que ele vai usar qualquer python
executável aparece em primeiro lugar o usuário do $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 experimental /home/phred/bin/python
que não funciona corretamente.
E se python
é instalado apenas em /usr/local/bin
, um usuário que não tem /usr/local/bin
em $PATH
não vai mesmo ser capaz de executar o script. (Isso provavelmente não é muito provável nos sistemas modernos, mas pode acontecer facilmente para um intérprete mais obscuro.)
Ao especificar, #!/usr/bin/python
você especifica exatamente qual intérprete será usado para executar o script em um sistema específico .
Outro problema em potencial é que o #!/usr/bin/env
truque não permite que você passe argumentos para o intérprete (exceto o nome do script, que é passado implicitamente). Isso geralmente não é um problema, mas pode ser. Muitos scripts Perl são escritos com #!/usr/bin/perl -w
, mas use warnings;
é a substituição recomendada atualmente. Os scripts #!/bin/csh -f
csh devem usar - mas os scripts csh não são recomendados em primeiro lugar. Mas poderia haver outros exemplos.
Eu tenho vários scripts Perl em um sistema de controle de origem pessoal que instalo quando configuro uma conta em um novo sistema. Eu uso um script de instalação que modifica a #!
linha de cada script à medida que o instala no meu $HOME/bin
. (Eu não precisei usar nada além de #!/usr/bin/perl
ultimamente; ele remonta aos tempos em que o Perl geralmente não era instalado por padrão.)
Um ponto secundário: o #!/usr/bin/env
truque é indiscutivelmente um abuso do env
comando, que foi originalmente planejado (como o nome indica) para invocar um comando com um ambiente alterado. Além disso, alguns sistemas mais antigos (incluindo SunOS 4, se bem me lembro) não tinha o env
comando /usr/bin
. É provável que nenhum destes seja uma preocupação significativa. env
funciona dessa maneira, muitos scripts usam esse #!/usr/bin/env
truque, e os provedores de SO provavelmente não farão nada para quebrá-lo. Ele pode ser um problema se você quiser que seu script para ser executado em um sistema muito antigo, mas, em seguida, é provável que você precisa modificá-lo de qualquer maneira.
Outra questão possível (graças a Sopalajo de Arrierez por apontar nos comentários) é que os trabalhos cron são executados em um ambiente restrito. Em particular, $PATH
normalmente é algo parecido /usr/bin:/bin
. Portanto, se o diretório que contém o intérprete não estiver em um desses diretórios, mesmo que esteja no seu padrão $PATH
em um shell de usuário, o /usr/bin/env
truque não funcionará. Você pode especificar o caminho exato ou adicionar uma linha ao seu crontab para definir $PATH
( man 5 crontab
para detalhes).