为什么要从子外壳启动后台进程/为什么要在 (someCommand &) 中使用括号?



我遇到了一个以(myDir/myScript.sh arg1 arg2 &)运行脚本

据我了解,它是在子外壳中运行脚本,也可以在该子外壳的背景中运行。

如果我在没有创建新子外壳的括号的情况下运行脚本myDir/myScript.sh arg1 arg2 &,会不会有任何副作用?

在子 shell 中运行它的通常原因是,当后台进程开始和结束时,shell 不会打印消息。

此外,如果脚本使用 wait 命令,它不会等待在 subshell 中启动的后台进程(进程只能等待自己的子进程,而不能等待孙子进程)。

这也意味着,如果脚本在子 shell 中启动,则脚本无法获取后台进程的退出状态——您需要使用 wait 来获取该状态。并且$!变量不会设置为后台进程的 PID(它在子 shell 内部设置,而不是原始 shell 进程)。

基本上,如果原始shell不需要处理后台进程,则使用(command&),它只想启动它并忘记它。

最新更新