O shebang #!
é uma instância legível por humanos de um número mágico que consiste na cadeia de bytes 0x23 0x21
, que é usada pela família de funções exec()
para determinar se o arquivo a ser executado é um script ou um binário. Quando o shebang estiver presente, exec()
executará o executável especificado após o shebang.
Observe que isso significa que, se você invocar um script especificando o interpretador na linha de comando, como é feito em ambos casos apresentados na pergunta, exec()
executará o interpretador especificado no linha de comando, nem sequer olhará para o script.
Assim, como outros notaram, se você quiser que exec()
chame o interpretador especificado na linha shebang, o script deve ter o bit executável definido e chamado como ./my_shell_script.sh
.
O comportamento é fácil de demonstrar com o seguinte script:
#!/bin/ksh
readlink /proc/$$/exe
Explicação:
-
#!/bin/ksh
defineksh
como o interpretador. -
$$
contém o PID do processo atual. -
/proc/pid/exe
é um link simbólico para o executável do processo (pelo menos no Linux; no AIX, o /proc/$$/object/a.out é um link para o executável). -
readlink
emitirá o valor do link simbólico.
Exemplo:
Nota : Estou demonstrando isso no Ubuntu, onde o shell padrão /bin/sh
é um link simbólico para traço , ou seja, /bin/dash
e /bin/ksh
é um link simbólico para /etc/alternatives/ksh
, que por sua vez é um symlink para /bin/pdksh
.
$ chmod +x getshell.sh
$ ./getshell.sh
/bin/pdksh
$ bash getshell.sh
/bin/bash
$ sh getshell.sh
/bin/dash