在bash中,“exec some_cmd&”是什么意思?

5

我在这个脚本中发现了使用exec some_cmd &的用法:

...
exec elixir \
  -pa _build/prod/consolidated \
  --no-halt \
  --erl "+A$THREAD_COUNT" \
  --erl "+K true" \
  --erl "-smp auto" \
  --erl "+scl false" \
  --erl "+spp true" \
  --erl "+swt low" \
  --erl "+sbwt long" \
  --sname $NODE \
  --cookie $COOKIE \
  -S mix run \
    --no-compile \
$@ \
&
...

exec some_cmd 会用 some_cmd 替换原来的 shell。而 some_cmd & 则是在后台产生一个子进程来运行 some_cmd

那么将它们结合起来会发生什么呢?

我用 bash 3.2 尝试了一下,结果显示似乎它会在后台产生一个进程:

# script
echo "Shell PID: $$"
exec sh -c 'echo "Child PID: $$"' &
BG_PID=$!
echo "Background process PID: $BG_PID"

# output
Shell PID: 8852
Background process PID: 8853
Child PID: 8853

虽然我不确定它是否与 some_cmd & 完全相同。


这个链接看起来相关,但并没有真正回答问题。 - Steven
1
@Steven 谢谢,但那是关于_Tcl_的exec命令,不是Bash的。 - uasi
1个回答

6
在这种情况下,exec命令没有任何作用。通常情况下,exec会在调用execve之前阻止bash进行分叉,但在这种情况下,bash仍会进行分叉,因为你使用了&
因此,exec some_cmd &some_cmd &相同。
如果需要使用exec标志之一,则仍可以使用exec&。输入help exec以查看exec支持的标志。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接