我试图理解一个我应该维护的 bash 脚本并被卡住了。命令的形式如下:
. $APP_LOCATION/somescript.sh param1 param2 &
该行没有在循环中被调用,也没有任何返回码从 somescript.sh 发送回调用脚本
我知道“。” 将使进程在同一个shell中运行。但是“&”会产生一个不同的过程。
这听起来很矛盾。这里到底发生了什么?有任何想法吗?
该脚本在后台进程中运行,但它是一个子shell,而不是一个单独调用的解释器,因为它没有点。
也就是说——当前的解释器分叉然后开始运行命令(采购脚本)。因此,它继承了 shell 变量,而不仅仅是环境变量。
否则,将通过调用调用新脚本的解释器execv()
,这将用新的解释器替换当前的解释器。.
这通常是正确的,因为它提供了更大的灵活性——毕竟,除了使用or为同一个 shell 编写的脚本之外,你不能运行任何东西source
,而启动一个新的解释器意味着你的其他脚本可以用 Python、Perl 重写,编译的二进制文件等,而其调用者无需更改。
(这就是为什么要执行的脚本,而不是要获取的库,不应该有文件扩展名的部分原因——以及为什么bash
库应该是.bash
而不是.sh
,这样不提供不准确信息的部分原因他们可以使用什么样的口译员)。
. $APP_LOCATION/somescript.sh param1 param2 &
这会将脚本作为当前 shell 中的后台作业提供。
在 Bash 中,using.
相当于 [source builtin]。内置源的帮助说(部分):
$ help source
source: source filename [arguments]
Execute commands from a file in the current shell.
换句话说,它会读取您的 Bash 脚本并在当前 shell 中而不是在子 shell 中对其进行评估。这对于让脚本访问未导出的变量通常很重要。
& 号使用作业控制在后台执行脚本。在这种情况下,虽然源脚本是在当前 shell 的上下文中评估的,但它是在一个单独的进程中执行的,该进程可以使用job control builtins进行管理。