如何将子shell及相关命令置于后台?

如何将子shell及相关命令置于后台?

在子 shell 中运行序列命令,如下所示:

(git pull;git rebase develop)&>/dev/null 

我认为这会将子 shell 及其创建的所有子进程置于后台,并将控制权返回给用户。

但实际上,终端挂起了一段时间,似乎是在等待子 shell 中的命令完成。

那么任何人都可以解释为什么会发生这种情况,以及完成此类工作的正确方法是什么。

答案1

如果您正在运行bashshell,&>/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任务完成。

相关内容