在bash中,点命令&符号是做什么的?

我试图理解一个bash脚本,我应该维护和卡住。 该命令是这种forms:

. $APP_LOCATION/somescript.sh param1 param2 & 

该行不在循环中调用,不是从somescript.sh返回到调用脚本的任何返回代码

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

这听起来是矛盾的。 这里真的发生了什么? 有任何想法吗?

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

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

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

(这是为什么要执行脚本的原因之一,而不是源于图书馆的原因,不应该有文件扩展名 – 这也是为什么bash库应该是.bash而不是.sh ,以至于不准确的信息没有提供什么样的口译员可以来源)。

TL; DR

 . $APP_LOCATION/somescript.sh param1 param2 & 

这会将脚本作为当前shell的后台作业。

采购脚本

在Bash中,使用. 相当于[source builtin]。 内建源代码的帮助(部分):

 $ help source source: source filename [arguments] Execute commands from a file in the current shell. 

换句话说,它会读入您的Bash脚本,并在当前shell中而不是在子shell中对其进行评估。 让脚本访问未导出的变量通常很重要。

背景工作

&符使用作业控制在后台执行脚本。 在这种情况下,虽然源脚本在当前shell的上下文中进行评估 ,但是它是在一个单独的进程中执行的 ,可以使用作业控制内置管理来进行管理。