O kernel reconhece certos formatos de arquivo que podem ser executados nativamente. Isso inclui pelo menos um formato binário. Além disso, os arquivos que começam com #!
( shebang ) são considerados scripts; por exemplo, se um arquivo estiver localizado em /path/to/script
e começar com #!/bin/bash
, o kernel executará /bin/bash /path/to/script arg1 arg2
quando você invocar /path/to/script arg1 arg2
.
Se o kernel não reconhecer o formato do arquivo, ele retornará ENOEXEC (erro de formato exec) do execve
chamada do sistema. Seguindo uma tradição dos antigos kernels Unix que não tinham o recurso shebang, a maioria dos programas faz uma segunda tentativa de executar um programa quando a primeira tentativa falha com o erro ENOEXEC: eles tentam executar /bin/sh
como o intérprete de script .
Bash é uma exceção notável: ele executa o script em si, não em /bin/sh
. Então o seu script estava funcionando por acidente quando você o invocou do bash.
Se você deixar a linha shebang, seu script pode ser executado em /bin/bash
ou sob /bin/sh
, dependendo de qual programa foi executado. E /bin/sh
evidentemente não suporta a substituição de processos no seu sistema. Provavelmente ainda é bash (a mensagem de erro parece com a do bash), mas quando o bash é invocado sob o nome sh
, ele entra no modo de compatibilidade POSIX que não suporta a substituição do processo.
A moral da história: se você escrever um script bash, deverá colocar #!/bin/bash
na primeira linha.