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

时间:2013-08-28 11:47:07

标签: linux bash shell

我正在尝试理解一个bash脚本,我应该维护并卡住。该命令的格式为:

. $APP_LOCATION/somescript.sh param1 param2 &

这个行没有被循环调用,也没有任何返回代码bening从somescript.sh发送回调用脚本

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

(这是为了执行脚本的原因的一部分,而不是那些意图来源的库,不应该有文件扩展名 - 以及为什么bash库应该是.bash的部分原因},而不是.sh,因此没有提供关于他们可以获得哪种解释器的不准确信息。)

答案 1 :(得分:0)

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中对其进行评估。这对于让脚本访问未导出的变量通常很重要。

后台工作

&符号使用job control在后台执行脚本。在这种情况下,当源脚本在当前shell的上下文中进行评估时,它在一个单独的进程中执行,可以使用job control builtins进行管理。