7

我试图理解一个我应该维护的 bash 脚本并被卡住了。命令的形式如下:

. $APP_LOCATION/somescript.sh param1 param2 &

该行没有在循环中被调用,也没有任何返回码从 somescript.sh 发送回调用脚本

我知道“。” 将使进程在同一个shell中运行。但是“&”会产生一个不同的过程。

这听起来很矛盾。这里到底发生了什么?有任何想法吗?

4

2 回答 2

6

该脚本在后台进程中运行,但它是一个子shell,而不是一个单独调用的解释器,因为它没有点。

也就是说——当前的解释器分叉然后开始运行命令(采购脚本)。因此,它继承了 shell 变量,而不仅仅是环境变量。

否则,将通过调用调用新脚本的解释器execv(),这将用新的解释器替换当前的解释器。.这通常是正确的,因为它提供了更大的灵活性——毕竟,除了使用or为同一个 shell 编写的脚本之外,你不能运行任何东西source,而启动一个新的解释器意味着你的其他脚本可以用 Python、Perl 重写,编译的二进制文件等,而其调用者无需更改。

(这就是为什么要执行的脚本,而不是要获取的库,不应该有文件扩展名的部分原因——以及为什么bash库应该是.bash而不是.sh,这样不提供不准确信息的部分原因他们可以使用什么样的口译员)。

于 2013-08-28T11:50:05.670 回答
1

TL;博士

. $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进行管理。

于 2013-08-28T12:33:07.027 回答