为什么源(或点命令)不需要文件可执行

为什么源(或点命令)不需要文件可执行

从跑步help .help source

在当前 shell 中执行文件中的命令。

在当前 shell 中读取并执行来自 FILENAME 的命令。 $PATH 中的条目用于查找包含 FILENAME 的目录。

从我的角度来看,点命令(或命令source)似乎只是在当前 shell 上下文中运行 shell 脚本(而不是生成另一个 shell)。

问题.:为什么(或)不source要求文件像运行普通脚本一样可执行?

答案1

假设我有一个 shell 脚本 ( my-script.sh),开头为:

#!/bin/sh

如果脚本设置了执行权限,那么我可以使用以下命令运行脚本:

./my-script.sh

在这种情况下,您最终要求内核my-script.sh作为程序运行,并且内核(程序加载器)将首先检查权限,进而用于/bin/sh ./my-script.sh实际执行您的脚本。

但shell( /bin/sh)不关心执行权限,也不检查它们。所以如果你称这个...

/bin/sh ./my-script.sh

...内核从未被要求my-script.sh作为程序运行。内核(程序加载器)只被要求运行/bin/sh。所以执行权限永远不会被我检查。也就是说,您不需要执行权限来运行这样的脚本。


回答你的问题:

./my-script.sh您调用和在另一个脚本中调用之间的区别. ./my-script.sh完全相同。在第一个中,您要求内核将其作为程序运行,在第二个中,您要求当前的 shell 从脚本中读取命令,并且 shell 不需要(或关心)执行权限来执行此操作。


进一步阅读:

当您仔细考虑时,将脚本作为程序运行是令人惊讶的行为。它们不是用机器代码编写的。我会阅读为什么这有效;从阅读 shebang 开始 ( #!)https://en.wikipedia.org/wiki/Shebang_(Unix)

使用点符号运行脚本对于共享变量是必要的。所有其他运行机制都会启动一个新的 shell“上下文”,这意味着被调用脚本中设置的任何变量都不会传递回调用脚本。 Bash 文档有点精简,但在这里:https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html

答案2

当你说source script.sh或者. script.sh你永远不会执行脚本时。您正在运行的是一个source执行某些操作的shell 命令。这个“东西”包括从 script.sh 读取并执行已读取的内容。为此,您的脚本需要可读。不需要可执行性。

该行为类似于跑步bash non-executable-script.shpython non-executable-script.py

相关内容