为什么 shell 在没有读取权限的情况下知道文件的 shebang 行中指定的解释器
Why the shell knows the interpreter specified in the shebang-line of a file without read permission
我正在 Linux 上学习 shell,
但我遇到了一个似乎令人困惑的问题。
- 我的环境是:
- OS:Manjaro 21.2.6 Qonos
- 内核:x86_64 Linux 5.15.38-1-MANJARO
- Shell: zsh 5.8.1 (x86_64-pc-linux-gnu)
- 问题是:
- 我创建了一个名为
foo
的文件,并向它回显#\!/bin/sh
,文件foo
的权限已通过[=15]修改为100
=].
- 文件
foo
确实没有读写权限,确实如此,
- 但是当我执行命令
./foo
时,我得到了错误/bin/sh: ./foo: permission denied
。
那么为什么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 内核源代码以获取更多详细信息。
我正在 Linux 上学习 shell, 但我遇到了一个似乎令人困惑的问题。
- 我的环境是:
- OS:Manjaro 21.2.6 Qonos
- 内核:x86_64 Linux 5.15.38-1-MANJARO
- Shell: zsh 5.8.1 (x86_64-pc-linux-gnu)
- 问题是:
- 我创建了一个名为
foo
的文件,并向它回显#\!/bin/sh
,文件foo
的权限已通过[=15]修改为100
=]. - 文件
foo
确实没有读写权限,确实如此, - 但是当我执行命令
./foo
时,我得到了错误/bin/sh: ./foo: permission denied
。
- 我创建了一个名为
那么为什么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 内核源代码以获取更多详细信息。