![如何将子shell及相关命令置于后台?](https://linux22.com/image/93581/%E5%A6%82%E4%BD%95%E5%B0%86%E5%AD%90shell%E5%8F%8A%E7%9B%B8%E5%85%B3%E5%91%BD%E4%BB%A4%E7%BD%AE%E4%BA%8E%E5%90%8E%E5%8F%B0%EF%BC%9F.png)
在子 shell 中运行序列命令,如下所示:
(git pull;git rebase develop)&>/dev/null
我认为这会将子 shell 及其创建的所有子进程置于后台,并将控制权返回给用户。
但实际上,终端挂起了一段时间,似乎是在等待子 shell 中的命令完成。
那么任何人都可以解释为什么会发生这种情况,以及完成此类工作的正确方法是什么。
答案1
如果您正在运行bash
shell,&>/dev/null
则会将标准输出和错误流重定向到/dev/null
(与 相同>/dev/null 2>&1
),但它不会将( ... )
子 shell 作为异步进程运行。为此,您需要&
在末尾添加额外的内容:
(git pull; git rebase develop) &>/dev/null &
ksh93
没有这个功能,POSIX 中也没有这个功能。
答案2
您可以sleep
在您的案例中添加并&
在命令末尾添加它们以将它们置于后台,
(git pull; sleep 3; git rebase develop) &>/dev/null &
或者你可以使用,
for cmd in $commands
do
"$cmd" &
done
wait
&
命令末尾的 会在后台运行它,并等待后台wait
任务完成。