我在this script中找到了使用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 &
完全相同。
答案 0 :(得分:3)
exec
命令在这种情况下无效。通常情况下,exec
会在调用execve
之前阻止bash分叉,但在这种情况下bash forks仍然是因为你说&
。
因此exec some_cmd &
与some_cmd &
相同。
如果您需要使用其中一个exec
标记,则可以将&
与exec
一起使用。输入help exec
以查看exec
支持的标记。