为什么 shell 在没有读取权限的情况下知道文件的 shebang 行中指定的解释器

Why the shell knows the interpreter specified in the shebang-line of a file without read permission

我正在 Linux 上学习 shell, 但我遇到了一个似乎令人困惑的问题。

那么为什么Shell在没有读取权限的情况下知道文件foo中的shebang是什么???

如果有哪位朋友能提出建议,我将不胜感激!

behavior-example

您收到此错误是因为脚本本身没有执行或读取权限。要 shell 中的 运行 脚本(在路上),您需要具有读取和执行权限:

chmod 500 foo
./foo

运行 脚本的另一种方式是:

sh foo

并且在这种情况下您不需要执行权限。作为记录,标准方法是使用如下构造:

#!/bin/sh

你不需要转义感叹号

So why the Shell knows what the shebang in the file foo is without the read permission ???

读取 shebang 行的不是 shell,而是 OS/kernel。

shell脚本可以像编译程序一样执行。该进程使用 exec* 系列的函数,并传递 ./foo 作为要执行的程序。这些函数是基于系统调用的。

然后OS/kernel检测该文件是可以直接执行的编译程序还是必须传递给解释器的脚本文件。如果文件包含 shebang 行,OS 将执行 指定的 解释器,它不必是 shell,否则它将 运行 默认 shell。脚本文件作为参数传递给解释器。

shell 是 运行 普通用户权限,在尝试打开脚本文件时会出错。


您可以在 POSIX specification of the exec function family or in the Linux manual page for execve 中找到有关执行脚本的一些信息。搜索词 interpreter。您可以查看 Linux 内核源代码以获取更多详细信息。