Não. A linha shebang é processada pelo seu kernel ou biblioteca do sistema * e não processa variáveis shell.
-
Se você quisesse usar uma variável de ambiente como o interpretador por algum motivo, você poderia criar um executável "trampolim" (não script!) que gerasse novamente
$SHEBANG "$@"
. Você precisaria omitir o#!
da variável nesse caso;#!
é útil apenas quando é literalmente os dois primeiros bytes de um arquivo. -
Outra opção é fazer uso do fato de que scripts sem linhas shebang (geralmente) serão executados como shell scripts com
sh
ou o shell de chamada . Se houver uma sintaxe de comentário para o seu destino shebang que se sobreponha de maneira útil com a sintaxe do shell, você poderá fazê-lo funcionar. Esta estratégia é ou costumava ser comum com intérpretes Lisp. No caso do seu exemplo, onde o interpretador também ésh
, isso não é viável. -
Você pode empurrar as coisas ainda mais nessa linha se puder confiar no
bash
presente: um script cuja primeira linha éexec /bin/bash -c 'exec "$SHEBANG" <(tail -n +2 "$0")' "$0" "$@"
funcionará para a maioria dos intérpretes; O Bash é usado como uma etapa intermediária para que a substituição do processo possa ser usada para
tail
pule a primeira linha para nós, para que não acabemos em uma Loop infinito. Alguns intérpretes exigem que o arquivo seja procurado e eles não aceitarão um pipeline como este.
Vale a pena considerar se isso é realmente algo que você quer fazer. Além de quaisquer preocupações de segurança, não é muito útil: alguns scripts podem ter seus intérpretes alterados assim, e onde eles podem, quase certamente, ficar melhor com uma lógica mais restrita que gerou a correta para a situação. (talvez um script de shell no meio, que chama o interpretador com o caminho para o script real como um argumento).
* Nem sempre; Em certas circunstâncias, algumas shells irão ler elas mesmas, mas elas ainda não farão expansão variável.