Acho que a resposta à sua pergunta é basicamente "não". O mecanismo shebang simplesmente não é tão flexível.
A linha #!
apenas permite especificar um comando para executar e (opcionalmente) um único argumento para esse comando. O nome do script é passado como outro argumento. Então, se foo.zsh
começar com:
#!/usr/bin/env zsh
a execução foo.zsh
é equivalente a executar /usr/bin/env zsh foo.zsh
.
Se você especificou o caminho para zsh
diretamente, pode passar um argumento adicional:
#!/usr/bin/zsh -
Mas com o #!/usr/bin/env
hack, zsh
é o argumento adicional.
Aparentemente, esse comportamento varia de sistema para sistema, como você viu. BTW, gostaria de verificar se o -
não está sendo ignorado no Ubuntu.
Se você pode confiar em zsh
estar em um local consistente em todos os sistemas que você gosta, você pode usar #!/usr/bin/zsh -
(ignorando sua primeira diretriz).
Se você não puder, crie um link simbólico para zsh
em um local consistente em cada sistema ou modifique a linha #!
em seu script à medida que você o instala. (Eu fiz isso para scripts Perl, nos dias em que Perl não era sempre /usr/bin/perl
.)
Ou você pode escrever um wrapper que, quando invocado sem argumentos, invoca zsh
com um argumento -
e altera seu shebang para:
#!/usr/bin/env zsh-wrapper
que requer apenas zsh-wrapper
em algum lugar em $PATH
, não necessariamente em um local consistente.
Veja também esta pergunta e minha resposta para isso para uma discussão das vantagens e desvantagens do #!/usr/bin/env
hack.
E veja esta página para mais informações sobre o comportamento do shebang em vários sistemas do tipo Unix ( obrigado a Stephane Chazelas pelo link).