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/kshdefinekshcomo 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). -
readlinkemitirá 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