Quando você executa um programa, o kernel verifica se ele inicia por alguma sequência de bytes mágicos . Se o arquivo executável começar com #!
, o kernel interpretará o resto da linha como um nome de intérprete. Se o arquivo executável começar com 7ELF
(onde 7
é o byte 127), ele carregará o arquivo como um ELF executável; esse é o tipo normal na maioria dos sistemas unix atualmente.
Se o kernel não reconhecer o formato do arquivo, ele se recusará a executar o arquivo e retornará o erro ENOEXEC (erro de formato Exec). Quando o shell percebe isso, ele se encarrega de executar o programa como um script de shell.
Para testemunhar isso em ação, adicione alguns comandos ao seu script:
ps l $$
ls -l /proc/$$/exe
echo hello
(Isto é para o Linux, ajuste para outros unices.) Em seguida, tente executar esse script a partir de vários shells. Você verá que alguns shells geram novas instâncias de si mesmos para executar o script (bash, ksh93) enquanto outros geram /bin/sh
(dash, pdksh, zsh).