A linha shebang é interpretada pelo kernel e não é muito flexível. No Linux, ele é limitado a um único argumento: a sintaxe é #!
, espaços em branco opcionais, caminho para o interpretador (sem espaço em branco), espaço em branco opcional e, opcionalmente, um único argumento (que pode conter espaços em branco, exceto no início). Além disso, o tamanho total da linha shebang é limitado a 128 bytes ( BINPRM_BUF_SIZE
constante nas fontes do kernel, usada em load_script
).
Se você quiser passar mais de um argumento, precisará de uma solução alternativa. Se você estiver usando #!/usr/bin/env
para expansão de caminho, então só há espaço para o nome do comando e nenhum outro argumento.
A solução mais óbvia é um script de wrapper. Em vez de ter /path/to/my-script
contendo o código mocha, coloque o código mocha em outro arquivo /path/to/my-script.real
e torne /path/to/my-script
um pequeno script de shell. Aqui está um wrapper de amostra que assume que o código real está em um arquivo com o mesmo nome do script, além de .real
no final.
#!/bin/sh
exec mocha --reporter=tap --output=foo "$0.real" "$@"
Com um invólucro de shell, você pode aproveitar a oportunidade para fazer coisas mais complexas, como definir variáveis de ambiente, procurar versões de intérprete disponíveis, etc.
Usando exec
antes que o interpretador garanta que o script mocha seja executado no mesmo processo que o wrapper shell. Sem exec
, dependendo do shell, ele pode ser executado como um subprocesso, o que importa, e. se você quiser enviar sinais para o script.
Às vezes, o script wrapper e o código real podem estar no mesmo arquivo, se você conseguir escrever um poliglota - um arquivo que é um código válido em dois idiomas diferentes. Escrever poliglotas nem sempre é fácil (ou até possível), mas tem a vantagem de não precisar gerenciar e implantar dois arquivos separados. Aqui está um JavaScript / shell poliglota em que a parte do shell executa o interpretador de JS no arquivo (supondo que o interpretador de JS ignore a linha shebang, não há muito o que fazer se não o fizer):
#!/bin/sh
///bin/true; exec mocha --reporter=tap --output=foo "$0" "$@"
… (the rest is the JS code) …