
Bash、zsh 或您选择的 OSS 发行版中任何您喜欢的 shell 的好处之一是您可以轻松地使用脚本。这些可以是 shell 脚本,也可以使用 Perl、Python 或其他解释器,如脚本开头的 shebang ( #!
) 所定义。该签名后面是解释路径,可以是/bin/sh
以实现跨操作系统的最大兼容性,但这实际上是如何工作的呢?正如 [Bruno Croci]在深入研究这个问题时发现的那样,解释 shebang 的不是 shell,而是内核。
在使用 shebang 运行可执行 shell 脚本后,使用strace
很容易找出基本执行顺序。第一点是execve
,这是一个直接进入 Linux 内核的系统调用 ( fs/exec.c
)。这里分析“二进制程序”的可执行格式,对于 shell 脚本,我们可以使用binfmt_script.c
。顺便说一句, binfmt_misc.c
源文件提供了一个有趣的绕道,因为它涉及魔术字节序列来执行类似于 shebang 的操作。
作为奖励,[Bruno] 还深入研究了使用 shebang 执行脚本与在 shell 中运行脚本(例如sh script.sh
)之间的区别,然后最后查看了 shebang-ed shell 脚本的执行权限的检查位置。
原文: https://hackaday.com/2025/04/11/tracing-the-how-the-linux-kernel-handles-the-shebang/