我正在运行一些耗时的可执行文件,这些可执行文件在循环中作为后台作业并行分配了不同的参数。这是一个玩具示例及其输出:
bash-3.2$ set -o notify
bash-3.2$ for (( i=0 ; i < 4 ; i+=2 )); do
> sleep ${i} &
> done
[1] 32394
[2] 32395
bash-3.2$ [1]- Done sleep ${i}
[2]+ Done sleep ${i}
请注意,当每个作业完成运行时,它会通知我。在完成消息中,将显示作业的命令,但是在参数未展开的方式中,因此没有明显的方法通过查看消息来判断它正在使用哪个参数值。我希望这个消息是什么样的
bash-3.2$ [1]- Done sleep 0
[2]+ Done sleep 2
有可能这样做吗?
谢谢和问候!
答案 0 :(得分:1)
不太漂亮:
for (( i=0 ; i < 4 ; i+=2 )); do
sleep ${i} && echo -en "\nsleep ${i} "&
done
输出如下:
[1] 29311
[2] 29313睡眠0 [1] - 完成睡眠$ {i}&amp;&amp; echo -en“\ nsleep $ {i}”
用户@主机:〜$
睡2 [2] +完成睡眠$ {i}&amp;&amp; echo -en“\ nsleep $ {i}”
一个功能可以稍微提高一点:
myeval () {
eval "$*" && echo -en "\n$* "
}
然后你可以这样做:
for (( i=0 ; i < 4 ; i+=2 )); do
myeval "sleep ${i}"&
done
,输出如下:
[1] 29635
[2] 29636睡眠0 [1] - 完成myeval“sleep $ {i}”
用户@主机:〜$
睡2 [2] +完成myeval“sleep $ {i}”
答案 1 :(得分:0)
如果你想等到最后一个完成......
for ((i=0; i < 4; i+=2 )); do
long_running_process $i &
done
wait
每个long_running_process(假设它是一个shell脚本)可以在终止之前立即打印出状态消息及其自己的$ 1。