例如,如果我这样做
[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 似乎试图将这个“可执行文件”解释为脚本。但是,有两种情况显然不会发生这种情况:当文件以#!
, 和 ELF 文件开头时。还有吗?某处有这方面的综合文档吗?
答案1
扩展于我之前对另一个答案的评论, 内核包含七个二进制加载器(查找以binfmt_
There 开头的文件,或阅读具体binfmt
的Kconfig
):
a.out
(目前是暂缓执行);- 极低频;
- FDPIC ELF(在 ARM、无 MMU SuperH 和 C6x 上);
em86
(阿尔法);- 平面二进制文件(在无 MMU 的系统、ARM 或 M68k 上);
- 脚本;
- 全能者
binfmt_misc
(也可以看看/proc/sys/fs/binfmt_misc/ 下的文件允许哪些类型的可执行格式?)。
这些决定了内核可以执行的可执行文件的类型。binfmt_misc
特别是允许内核处理许多其他二进制文件(至少从调用进程的角度来看)exec
功能之一)。
然而,这并没有涵盖全部内容,因为 C 库和 shell 本身也涉及其中。 POSIX 现在要求execlp
和execvp
函数,当遇到内核无法运行的可执行文件时,尝试使用 shell 运行它;看这里的理由了解详情。
所有这些交互以提供您所看到的行为的方式在当我在 shell 中执行文件时到底会发生什么?和哪个 shell 解释器运行不带 shebang 的脚本?