O shebang ( #!
) é chamado de número de magia . #!
é a forma legível dos 2 bytes 0x23 e 0x21. Se você vir a man page para a função C execve()
, a família dessas funções executivas está captando esses bytes e se comportando de maneira diferente quando presente.
trecho da página man execve ()
DESCRIPTION
execve() executes the program pointed to by filename. filename must be
either a binary executable, or a script starting with a line of the form:
#! interpreter [optional-arg]
For details of the latter case, see "Interpreter scripts" below.
argv is an array of argument strings passed to the new program. envp is
an array of strings, conventionally of the form key=value, which are
passed as environment to the new program. Both argv and envp must be
terminated by a null pointer. The argument vector and environment can be
accessed by the called program's main function, when it is defined as:
int main(int argc, char *argv[], char *envp[])
execve() does not return on success, and the text, data, bss, and stack
of the calling process are overwritten by that of the program loaded.
If the current program is being ptraced, a SIGTRAP is sent to it after a
successful execve().
O olho agudo notará que a forma do shebang leva apenas 2 argumentos. Sendo um deles o intérprete, o outro é um [optional-arg]
. É por isso que você não pode passar mais do que 1 argumento, pelo menos no Linux.
Portanto, comandos como esse não funcionarão, o -f
é ignorado, acredito.
#!/usr/bin/foo -i -f
No entanto, se o intérprete suportá-lo, você pode contornar essa limitação de certa forma:
#!/usr/bin/foo -if