我一直听说 shebang 行(例如#!/bin/bash
)的目标必须是二进制可执行文件,而不是脚本。对于许多操作系统(例如 MacOS)来说仍然如此。但令我惊讶的是,在 Linux 上情况并非如此,Linux 上最多可以使用 4 级脚本,其中第四个脚本在其 shebang 行中引用了二进制可执行文件。但是,如果使用 5 级脚本,则程序将失败并出现错误Too many levels of symbolic links
。
请参阅LWN 文章“程序如何运行”以及该文章中未显示的以下代码。
$ cat wrapper2
#!./wrapper
此更改何时发生(假设在某些时候不允许)?
据斯文·马斯切克(Sven Mascheck)(他通常可靠且消息灵通)说:
请注意,此递归涉及 Linux 实现的间接执行机制:
#!
脚本和通过 binfmt_misc 注册的可执行格式。例如,您可以有一个脚本,其中一行#!
指向用字节码编写的解释器,该解释器被分派到外部架构二进制文件,该二进制文件通过 Qemu 分派,并且计为 3 层嵌套。Sven Mascheck 还指出,没有 BSD 支持嵌套 shebang,但如果内核返回错误,某些 shell 将接管。