Linux 上有哪些类型的可执行文件?

ext*_*xe5 1 linux executable

例如,如果我这样做

[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
Run Code Online (Sandbox Code Playgroud)

Bash 似乎试图将这个“可执行文件”解释为脚本。但是,有两种情况显然不会发生这种情况:文件以#!, 和 ELF 文件开头。还有吗?某处是否有关于此的全面文档?

Ste*_*itt 6

扩展在我以前在另一个答案评论,内核包含七个二进制装载机(从外观的文件binfmt_存在,或读取binfmt特异性Kconfig):

这些决定了内核可以执行的可执行文件的类型。binfmt_misc特别是允许内核处理许多其他二进制文件(至少,从调用其中一个exec函数的进程的角度来看)。

然而,这并没有涵盖整个故事,因为 C 库和 shell 本身也涉及到。POSIX 现在要求execlpexecvp函数,当它们遇到内核无法运行的可执行文件时,尝试使用 shell 运行它;有关详细信息,请参阅此处的基本原理

所有这些交互以提供您所看到的行为的方式在我在 shell 中执行文件时究竟发生什么?哪个Shell解释程序运行不认领的脚本?