Se você quiser usar a versão instalada pelo sistema de um determinado interpretador instalado em um local padrão, use o caminho direto. Se você quiser usar qualquer versão do interpretador aparece primeiro no usuário $PATH , use #!/usr/bin/env ... .
O comando env chama um comando especificado, permitindo definir ou desmarcar variáveis de ambiente:
env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &
Se você não especificar nenhuma variável de ambiente ou outras opções, apenas invocará o comando named. (Usar dessa maneira é, sem dúvida, um truque.)
O propósito de escrever o shebang como
#!/usr/bin/env interp
é invocar o que quer que interp apareça primeiro em $PATH .
Isso significa que você não precisa saber, ao escrever o script, exatamente onde interp é (digamos, se poderia estar em /bin , /usr/bin ou /usr/local/bin ). É claro que você precisa saber que env é /usr/bin/env , mas isso parece ser razoavelmente universal.
A vantagem é que ele invoca qualquer versão do interpretador que apareça primeiro no usuário $PATH . A desvantagem é que invoca qualquer versão do intérprete aparece primeiro no usuário $PATH .
Por exemplo, suponha que eu tenha instalado uma versão pessoal de perl em meu diretório pessoal, como $HOME/bin/perl , e eu tenho $HOME/bin na frente do meu $PATH . Se eu executar um script cujo shebang é
#!/usr/bin/env perl
então ele será executado com o meu próprio executável perl instalado - o que pode não ser uma coisa boa. O autor do script provavelmente não testou com o Perl que eu construí da fonte há um mês.
Para algo como Perl ou Bash que provavelmente será instalado em um local consistente na maioria dos sistemas ( /usr/bin/perl e /bin/bash , respectivamente), usaria o caminho direto para o comando. Para algo mais obscuro que poderia ser instalado de forma diferente em sistemas diferentes, eu usaria o truque /usr/bin/env ou escreveria um instalador que ajustasse a linha shebang à medida que o script fosse instalado. (Eu costumava fazer isso para meus scripts Perl.)
UPDATE: Eu me concentrei em mais detalhes em esta resposta para esta pergunta no Unix e amp ; Site Linux .