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).