Não consigo reproduzir isso no Ubuntu 18.04.1.
Você deve testar echo "$@"
fora do script. Ele mostrará 1
se você já tiver digitado set 1
, ou os resultados de qualquer parâmetro posicional anterior set
(inclusive nos scripts de inicialização).
Observe que bash test.sh
executa test.sh
como um arquivo source
( .
) e qualquer linha #!
é ignorada. Para agir em !#
você precisaria:
bash -c test.sh
Quanto a por que env
é especificado, não tenho idéia, a menos que tenha sido adicionado como um marcador: teria um efeito se incluísse uma ou mais especificações de ambiente. Por exemplo, o seguinte especificaria bash
para ser executado com um arquivo de inicialização personalizado:
!#/usr/bin/env BASH_ENV=BashStart bash
...
Outro motivo, sugerido pela resposta de Attie, é que no OSX bash
por padrão não está em /bin/
, mas env
está em /usr/bin/
, como no Linux, portanto !#/usr/bin/env bash
permite bash
ser especificado como o shell em um script que será executado no Linux ou no OSX.