从跑步help .
或help source
从当前 shell 中的文件执行命令。
在当前 shell 中从 FILENAME 读取并执行命令。$PATH 中的条目用于查找包含 FILENAME 的目录。
从我的角度来看,点命令(或命令)似乎source
只是在当前 shell 上下文中运行 shell 脚本(而不是生成另一个 shell)。
问题:为什么不.
(或source
)像运行普通脚本时那样要求文件是可执行的?
从跑步help .
或help source
从当前 shell 中的文件执行命令。
在当前 shell 中从 FILENAME 读取并执行命令。$PATH 中的条目用于查找包含 FILENAME 的目录。
从我的角度来看,点命令(或命令)似乎source
只是在当前 shell 上下文中运行 shell 脚本(而不是生成另一个 shell)。
问题:为什么不.
(或source
)像运行普通脚本时那样要求文件是可执行的?
假设我有一个 shell 脚本 (
my-script.sh
),以:如果脚本设置了执行权限,那么我可以使用以下命令运行脚本:
在这种情况下,您最终要求内核
my-script.sh
作为程序运行,内核(程序加载器)将首先检查权限,然后用于/bin/sh ./my-script.sh
实际执行您的脚本。但是 shell (
/bin/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
当你说
source script.sh
或者. script.sh
你永远不会执行脚本时。您正在运行的是一个source
执行某些操作的 shell 命令。这个“东西”包括从 script.sh 读取和执行 what-has-been-read。为此,您的脚本需要可读。不需要可执行性。该行为类似于运行
bash non-executable-script.sh
等python non-executable-script.py
。