当我在Bash脚本中使用`&`函数时会发生什么?

Lig*_*ica 5 linux bash shell

我正在用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)

(也就是说,只有单个明显的调用barbaz;我完全不会被三行输出的相对顺序所困扰,我理解这可能会有所不同)

但我可能误解了输出和脚本本身.如果是这样,那肯定会解释我在实际代码中看到的奇怪之处,并且让我不必再深入挖掘.

是否有可能在子进程中,在调用之后foo,forked shell脚本将继续?这意味着我的shell脚本的其余部分将被执行两次

当我&在Bash脚本中使用这样的时候会发生什么?

bor*_*ans 3

在您的示例中,& 符号仅分叉对 foo() 的调用。它并不是分叉整个脚本。只有 foo() 在单独的线程中运行,该线程在 foo() 完成时退出。bar() 和 baz() 继续在同一个线程中运行

  • +1 解决问题的核心。狡辩: foo() 在(异步)*子shell*中运行,这是一个单独的*进程*。 (4认同)