我有一个for循环,我希望一次并行处理它4次。我尝试了https://unix.stackexchange.com/questions/103920/parallelize-a-bash-for-loop页面中的以下代码:
task(){
sleep 0.5; echo "$1";
}
N=4
(
for thing in a b c d e f g; do
((i=i%N)); ((i++==0)) && wait
task "$thing" &
done
)
我已将上述文件存储为test.sh,我得到的输出如下:
path$ ./test.sh
a
b
c
d
path$ e
f
g
并且光标在'g'之后没有回到我的终端,它无限期地等待/休眠。我希望光标回到我的终端而且我也不明白为什么输出'e'在我之前有我的路径,不应该输出连续显示为'a'到'g'并且代码应该停止?
很难理解你想要什么,但我认为你想做7件事,称为a
,b
,c
...... g
并行,一次不超过4个实例。
如果是这样,你可以试试这个:
echo {a..g} | xargs -P4 -n1 bash -c 'echo "$1"; sleep 2' {}
这将字母a
..g
发送到xargs
,然后为每个字母开始一个新的bash
shell,将一个字母(-n1
)传递给shell作为{}
。 bash
shell获取参数(它的第一个参数是$1
)并回送它然后在退出前等待2秒 - 所以你可以看到暂停。
-P4
告诉xargs
同时运行4个bash
实例。
这是一个运行的小视频。第一个使用-P4
并以4个为一组运行,第二个序列使用-P2
并且一次执行2个:
或者,更简单地说,如果你不介意花10秒钟安装GNU Parallel:
parallel -j4 -k 'echo {}; sleep 2' ::: {a..g}
如果你按回车玩具可以看到比你正常的外壳。如果要在退出脚本之前等待批处理进程,只需在脚本末尾添加wait