Sempre ouvi dizer que o alvo de uma linha shebang (por exemplo #!/bin/bash
) deve ser um executável binário, não um script. E isso ainda é verdade para muitos sistemas operacionais (por exemplo, MacOS). Mas fiquei surpreso ao ver que isso não é verdade no Linux, onde até 4 níveis de scripts podem ser usados, onde o quarto script faz referência a um executável binário em sua linha shebang. No entanto, se forem usados 5 níveis de scripts, o programa falhará com o erro Too many levels of symbolic links
.
Consulte o artigo do LWN "Como os programas são executados" e o código a seguir, que não foi mostrado nesse artigo.
$ cat wrapper2
#!./wrapper
Quando ocorreu essa mudança (assumindo que em algum momento ela não foi permitida)?
De acordo com Sven Mascheck (que geralmente é confiável e bem informado):
Observe que esta recursão diz respeito tanto aos mecanismos de execução indireta que o Linux implementa:
#!
scripts, quanto aos formatos executáveis registrados por meio de binfmt_misc. Então, por exemplo, você pode ter um script com uma#!
linha que aponta para um intérprete escrito em bytecode que é despachado para um binário de arquitetura estrangeira que é despachado via Qemu, e que conta com 3 níveis de aninhamento.Sven Mascheck também observa que nenhum BSD suporta shebang aninhado, mas que alguns shells assumirão o controle se o kernel retornar um erro.