例如,如果我这样做
[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 似乎试图将这个“可执行文件”解释为脚本。但是,有两种情况显然不会发生这种情况:当文件以 a#!
和 ELF 文件开头时。还有吗?在某处有这方面的综合文档吗?
扩展我之前对另一个答案的评论,内核包含七个二进制加载器(查找从那里开始的文件,
binfmt_
或阅读-specific):binfmt
Kconfig
a.out
(目前正在暂停执行);em86
(在阿尔法上);binfmt_misc
(另请参阅/proc/sys/fs/binfmt_misc/ 下的文件允许哪些可执行格式?)。这些决定了内核可以执行的可执行文件的类型。
binfmt_misc
特别是允许内核处理许多其他二进制文件(至少从调用其中一个exec
函数的进程的角度来看)。然而,这并没有涵盖整个故事,因为 C 库和 shell 本身也参与其中。POSIX 现在要求
execlp
andexecvp
函数在遇到内核无法运行的可执行文件时,尝试使用 shell 运行它;有关详细信息,请参阅此处的基本原理。所有这些交互以提供您所看到的行为的方式在我在 shell 中执行文件时究竟发生了什么中有详细说明?哪个shell解释器运行没有shebang的脚本?