重新审视 Bash 与 Source 的区别

重新审视 Bash 与 Source 的区别

想问一下关于bash和source的问题。

我承认它们都与 .sh 扩展文件一起使用,例如

bash setup.sh
source setup.sh

然而,如果有人能解释的话,我想知道这两者之间的区别。

有一个帖子使用 source 与 bash 命令,试图解释,但我无法澄清响应者是否试图说“源”忽略过去的定义并在当前 shell 中设置环境变量或 bash 忽略过去的定义并在当前 shell 中设置环境变量。

如果有人能够更好地描述源和 bash 之间的差异,那就太好了。

谢谢你!

答案1

您提供的链接未提及“过去的定义”,可能是因为这并不重要。source在当前 shell 中运行,并可影响当前 shell 中的变量。bash调用新 shell,该 shell 不能影响其父级的环境。此外,扩展.sh是完全可选的,并且明确不在 shell 初始化文件中使用。

答案2

当你运行 时会发生什么bash foo.sh?一个新的 bash 进程启动并读取和执行 中的命令foo.sh。执行完命令后,这个新进程退出,你会得到提示符,由当前 shell 回显。

当你运行source foo.sh(或. foo.sh) 时会发生什么?你基本上告诉你当前的 shell “不要从键盘读取命令,而是从这个文件读取命令,完成后再回到键盘”

什么时候有关系?当有命令改变 shell 的状态时;例如cd,,,以及其他一些命令。exitVAR=valuealias

假设foo.sh包含以下内容:

mkdir /tmp/bar

使用source或运行它都没有关系bash。现在,假设脚本的内容更改了变量,那么它就很重要了。当您运行 时bash foo.sh,会创建一个新的 bash,它会运行命令并退出;您的 shell 没有任何变化。另一方面,如果您source foo.sh你当前的 shell 变量已改变。

让我们举个例子。假设文件中有以下内容foo.sh

echo "Currently executing commands from foo.sh"
echo "changing variable foo."
foo=$RANDOM
echo "In shell with PID $$, the value of foo is now >>$foo<<"
echo "End of foo.sh"; echo

如果你跑步bash foo.sh然后会发生什么echo $foo? 如果你跑步source foo.sh然后会发生什么echo $foo

尝试多次。您会注意到,如果您运行bash foo.sh,则 foo 变量未在您的 shell 中设置。如果您运行source foo.sh,则每次都会设置(并更改)foo 变量。

相关内容