想要 Bash 片段解释

Nif*_*fle 1 bash shell-script

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 代码段中该行的作用吗?

Kus*_*nda 5

该代码在循环中生成了许多后台任务。这些任务中的每一个都运行与git和相关的命令puppet

作业可能会非常快地产生并且不会压倒系统,在等待所有当前运行的后台任务完成之前,代码只运行其中的 20 个。正是调用wait使脚本在继续之前等待所有后台任务完成,从而产生另外 20 个作业。

算术测试在先于呼叫wait将是真正的每个值$i均匀地除尽20,即用于$i = 20$i = 40

用于算术扩展的语法是现在已经$[ ... ]过时的bash语法$(( ... ))(可移植)。该%运营商是普通模运算符。


除了使用过时的语法之外,shell 还可能存在引用问题。变量扩展$DEST$M, 以及$i, 缺少引用,两个命令替换也是如此。如果其中任何一个包含或生成存在于$IFS(空格、制表符、换行符,默认情况下)中的字符,您可能会期望脚本失败或至少行为不端。

该代码还缺少wait循环后的final ,以正确等待循环启动的最后几个作业中的任何一个。如果可以保证循环将始终运行n*20时间(对于某个整数n),则不需要这样做。