Você já deve ter visto alguns shell-scripts começando com #!/usr/bin/env bash no lugar onde costumava ver #!/bin/bash. O motivo desta prática é simplesmente melhorar a portabilidade do seu script, e neste artigo veremos o motivo.

O comando env, se usado sem parâmetro algum, vai imprimir na tela uma lista (grande) com todas as variáveis de ambiente. Mas se o env for utilizado seguido de algum comando, ele executará este comando numa outra instância do shell.

Tá! E como isso influencia a portabilidade?!

Quando você usa #!/bin/bash você está especificando claramente que o bash está em /bin/. Isso parece ser o padrão nas distribuições Linux, mas existem outros "sabores" de Unix onde isto não acontece (o bash pode estar em /usr/bin/). Nestes sistemas, o seu script começando com #!/bin/bash vai gerar bad interpreter: No such file or directory e não será executado.

Portanto, se você quer que seu script tenha um alcance maior e seja utilizado por usuários em outros ambientes além do Linux, prefira usar a técnica do env.

Quando você executa env bash, o env vai procurar o bash no seu $PATH e executar o primeiro que encontrar. Geralmente o bash está no /bin/, mas um usuário rodando seu script em algum outro sistema pode ter o bash no /usr/bin/, ou até mesmo testando uma versão alternativa em /home/usuario/bin/bash.

Peraí! O que garante que o env vai estar sempre em /usr/bin/?!

Não há garantias! :)

A recomendação é baseada no que é comum de se ver nos sistemas Unix. A solução /usr/bin/env vem se mostrando amplamente utilizada, mas não é uma bala de prata que resolve o problema da portabilidade para todo o sempre.

Ainda assim eu recomendo utilizar #!/usr/bin/env bash no início de shell scripts. Pois entendo que é uma solução mais "forte" do que o #!/bin/bash.

E se eu não usar #! algum?

Recomendo que você nunca escreva e nem execute um shell-script sem um #! hashbang no início do arquivo. No post sobre shebang, vimos que a função dele é dizer ao kernel qual interpretador será usado para executar os comandos presentes no arquivo.

Se você executar um script sem um shebang especificando o interpretador, pode ser que o shell crie uma outra instancia de si mesmo e interprete o script. Isso significa que o shell executará seja lá quais forem os comandos encontrados no arquivo, mesmo que ele tenha sido escrito para zsh, ksh, dash ou seja lá qual for.

Portanto nunca não deixe seu script sem #! no começo (nem execute scripts assim).

Fontes