Por exemplo, se eu fizer
[OP@localhost executable]$ cat garbage
lalala
trololol
[OP@localhost executable]$ chmod +x garbage
[OP@localhost executable]$ ./garbage
./garbage: line 1: lalala: command not found
./garbage: line 2: trololol: command not found
Bash parece estar tentando interpretar este "executável" como um script. No entanto, há duas instâncias em que isso claramente não acontece: quando o arquivo começa com um #!
, e arquivos ELF. Existem mais? Existe uma documentação abrangente disso em algum lugar?
Expandindo meu comentário anterior em outra resposta , o kernel contém sete carregadores binários (procure arquivos começando com
binfmt_
lá ou leia obinfmt
-specificKconfig
):a.out
(que está atualmente em suspensão de execução );em86
(em Alfa);binfmt_misc
(veja também Que tipos de formatos executáveis os arquivos em /proc/sys/fs/binfmt_misc/ permitem? ).São eles que determinam os tipos de arquivos executáveis que o kernel pode executar.
binfmt_misc
em particular, permite que muitos outros binários sejam manipulados pelo kernel (pelo menos, da perspectiva do processo que chama uma dasexec
funções ).No entanto, isso não cobre toda a história, já que a biblioteca C e os próprios shells também estão envolvidos. O POSIX agora requer que as funções
execlp
eexecvp
, quando encontrarem um executável que o kernel não possa executar, tentem executá-lo usando um shell; veja o raciocínio aqui para mais detalhes.A maneira como tudo isso interage para fornecer o comportamento que você está vendo é detalhada em O que exatamente acontece quando executo um arquivo em meu shell? e Qual interpretador de shell executa um script sem shebang?