i=0
while read M; do
((cd $DEST/cfg/puppet/modules/$M || exit 1
[ -d .git ] && echo -n "$M: " && git pull) 2>&1 | prep $(printf %04d: $i) puppet/modules/$M) &
i=$[i+1]
[ $[ i % 20 ] = 0 ] && wait
done < $(dirname "$0")/modules-puppet.txt
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下[ $[ i % 20 ] = 0 ] && wait
上述 bash 代码段中该行的作用吗?
该代码在循环中生成了许多后台任务。这些任务中的每一个都运行与git
和相关的命令puppet
。
作业可能会非常快地产生并且不会压倒系统,在等待所有当前运行的后台任务完成之前,代码只运行其中的 20 个。正是调用wait
使脚本在继续之前等待所有后台任务完成,从而产生另外 20 个作业。
算术测试在先于呼叫wait
将是真正的每个值$i
均匀地除尽20,即用于$i = 20
,$i = 40
等
用于算术扩展的语法是现在已经$[ ... ]
过时的bash
语法$(( ... ))
(可移植)。该%
运营商是普通模运算符。
除了使用过时的语法之外,shell 还可能存在引用问题。变量扩展$DEST
和$M
, 以及$i
, 缺少引用,两个命令替换也是如此。如果其中任何一个包含或生成存在于$IFS
(空格、制表符、换行符,默认情况下)中的字符,您可能会期望脚本失败或至少行为不端。
该代码还缺少wait
循环后的final ,以正确等待循环启动的最后几个作业中的任何一个。如果可以保证循环将始终运行n*20
时间(对于某个整数n
),则不需要这样做。