例如,如果我这样做
[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 文件开头。还有吗?某处是否有关于此的全面文档?
扩展在我以前在另一个答案评论,内核包含七个二进制装载机(从外观的文件binfmt_
存在,或读取的binfmt
特异性Kconfig
):
a.out
(目前暂停执行);em86
(在阿尔法上);binfmt_misc
(另请参阅/proc/sys/fs/binfmt_misc/ 下的文件允许哪些类型的可执行格式?)。这些决定了内核可以执行的可执行文件的类型。binfmt_misc
特别是允许内核处理许多其他二进制文件(至少,从调用其中一个exec
函数的进程的角度来看)。
然而,这并没有涵盖整个故事,因为 C 库和 shell 本身也涉及到。POSIX 现在要求execlp
和execvp
函数,当它们遇到内核无法运行的可执行文件时,尝试使用 shell 运行它;有关详细信息,请参阅此处的基本原理。
所有这些交互以提供您所看到的行为的方式在我在 shell 中执行文件时究竟发生了什么?和哪个Shell解释程序运行不认领的脚本?
归档时间: |
|
查看次数: |
531 次 |
最近记录: |