“wait”用于在 for 循环中启动的进程,但不用于更早启动的其他进程

“wait”用于在 for 循环中启动的进程,但不用于更早启动的其他进程

假设我有几个正在运行的后台任务,但现在我想再运行两个后台任务,但只等待最后两个。例如:

# long running commands
sleep 60 &
sleep 60 &

# now wait only for these two:
sleep 5 & sleep 5 & wait; echo waited only for the 5s sleeps.

上面命令的结果是echo命令等待60s。

我知道我可以传递 pid 或 jobid 来等待。但由于我是在循环中启动进程for,因此我无法轻松获取 PID。

我尝试过这个,但没有运气:

{ sleep 3 & sleep 5 & } wait; echo did not wait :

sleep 10 & { sleep 3 ; sleep 3 ; }& wait %2; echo only wait 3s

PS:这个问题是一个延伸这个更简单的问题

答案1

你可以启动一个子shell:

{ sleep 20 && echo second output ; }
( sleep 2 & wait && echo first output ) 

子 shell 中的命令wait仅在那里有效。

答案2

根据@Kusalananda 在更简单的问题中的指导,我想出了这个例子。也许不是最简单的...

下面的所有代码都在交互式 shell 中。我只是将其分成几部分来获取答案,因为否则很难阅读。

请注意,在bash4.1 及更早版本中, ,!中的""会触发交互式 shell 中的历史记录替换(这在版本 4.2 中已修复)。这就是我被欺骗的原因。如果您确实想引用,$!可以使用"$! "尾随空格,以防止历史记录替换生效。

unset to_wait; 

date; 
sleep 3 & 

for i in 1 2 3; do 
    sleep 1 &
    # Don't put the ! in "" or you'll get an `event`. 
    to_wait+=( $! ); 
done; 
wait "${to_wait[@]}"; 

date; 
echo waited 1s for inner processes; 

# wait for the rest of the processes (just for illustration)
wait; 

date; 
echo waited 3s for outer process;

相关内容