我正在用shell脚本调试一个奇怪的东西,想知道我是否误解了Bash的"fork"(&
)是如何工作的,也许是因为我通常在单个命令中通过终端使用它,例如:
[~me]$ someExecutable &
Run Code Online (Sandbox Code Playgroud)
现在,在shell脚本中:
foo() {
echo "logic"
}
bar() {
echo "idic"
}
baz() {
echo "katra"
}
foo &
bar
baz
Run Code Online (Sandbox Code Playgroud)
我的目的是foo
异步调用函数,然后让脚本的其余部分继续在原始进程上下文中执行.
当我执行这个示例脚本我做得到预期的输出:
logic
idic
katra
Run Code Online (Sandbox Code Playgroud)
(也就是说,只有单个明显的调用bar
和baz
;我完全不会被三行输出的相对顺序所困扰,我理解这可能会有所不同)
但我可能误解了输出和脚本本身.如果是这样,那肯定会解释我在实际代码中看到的奇怪之处,并且让我不必再深入挖掘.
是否有可能在子进程中,在调用之后foo
,forked shell脚本将继续?这意味着我的shell脚本的其余部分将被执行两次?
当我&
在Bash脚本中使用这样的时候会发生什么?
在您的示例中,& 符号仅分叉对 foo() 的调用。它并不是分叉整个脚本。只有 foo() 在单独的线程中运行,该线程在 foo() 完成时退出。bar() 和 baz() 继续在同一个线程中运行