Não, isso não funcionará. Os dois caracteres #!
precisam ser os dois primeiros caracteres no arquivo (como você especificaria o que interpretou a instrução if?). Isso constitui o "número mágico" que a família de funções exec()
detecta quando determina se um arquivo que está prestes a executar é um script (que precisa de um intérprete) ou um arquivo binário (o que não é).
O formato da linha shebang é bastante rigoroso. Ele precisa ter um caminho absoluto para um intérprete e no máximo um argumento para ele.
O que você pode fazer é usar env
:
#!/usr/bin/env interpreter
Agora, o caminho para env
é geralmente /usr/bin/env
, mas tecnicamente isso não é garantia.
Isso permite que você ajuste a variável de ambiente PATH
em cada sistema para que interpreter
(seja bash
, python
ou perl
ou o que você tiver) seja encontrado.
Uma desvantagem dessa abordagem é que será impossível transmitir de forma portável um argumento para o intérprete.
Isso significa que
#!/usr/bin/env awk -f
e
#!/usr/bin/env sed -f
é improvável que funcione em alguns sistemas.
Outra abordagem óbvia é usar autotools GNU (ou algum sistema de modelagem mais simples) para encontrar o interpretador e colocar o caminho correto no arquivo em uma etapa ./configure
, que seria executada ao instalar o script em cada sistema. / p>
Também é possível recorrer à execução do script com um intérprete explícito, mas isso é obviamente o que você está tentando evitar:
$ sed -f script.sed