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.