我试图理解一个bash脚本,我应该维护和卡住。 该命令是这种forms:
. $APP_LOCATION/somescript.sh param1 param2 &
该行不在循环中调用,不是从somescript.sh返回到调用脚本的任何返回代码
我知道那个“。” 将使进程在同一个shell中运行。 但“&”会产生一个不同的过程。
这听起来是矛盾的。 这里真的发生了什么? 有任何想法吗?
脚本运行在后台进程中,但是它是一个子shell,而不是单独调用的解释器,因为它没有点。
也就是说 – 当前的解释器分叉,然后开始运行命令(采购脚本)。 因此,它继承了shell变量,而不仅仅是环境变量。
否则,新脚本的解释器将通过execv()
调用来调用,该调用将替换当前的解释器。 这通常是正确的,因为它提供了更多的灵活性 – 除了为同一个shell编写的脚本,你不能运行任何东西.
毕竟,开始一个新的解释器意味着你的其他脚本可以用Python,Perl,一个编译的二进制文件等来重写,而不需要其调用者需要改变。
(这是为什么要执行脚本的原因之一,而不是源于图书馆的原因,不应该有文件扩展名 – 这也是为什么bash
库应该是.bash
而不是.sh
,以至于不准确的信息没有提供什么样的口译员可以来源)。
. $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的上下文中进行评估 ,但是它是在一个单独的进程中执行的 ,可以使用作业控制内置管理来进行管理。