Bash 对于循环,shell脚本确实会等待命令的执行进行迭代
我有一个带有for循环的shell脚本。循环在迭代之前是否在其体中等待命令的执行 提前谢谢 这是我的密码。这些命令是按顺序执行还是并行执行Bash 对于循环,shell脚本确实会等待命令的执行进行迭代,bash,shell,for-loop,exec,Bash,Shell,For Loop,Exec,我有一个带有for循环的shell脚本。循环在迭代之前是否在其体中等待命令的执行 提前谢谢 这是我的密码。这些命令是按顺序执行还是并行执行 for m in "${mode[@]}" do cmd="exec $perlExecutablePath $perlScriptFilePath --owner $j -rel $i -m $m" $cmd eval "$cmd" done 假设您没有对命令进行后台处理,那么是的 例如
for m in "${mode[@]}"
do
cmd="exec $perlExecutablePath $perlScriptFilePath --owner $j -rel $i -m $m"
$cmd
eval "$cmd"
done
假设您没有对命令进行后台处理,那么是的 例如:
for i in {1..10}; do cmd; done
在继续循环之前,等待cmd
完成,而:
for i in {1..10}; do cmd &; done
没有
如果您想并行运行命令,我建议将循环更改为以下内容:
for m in "${mode[@]}"
do
"$perlExecutablePath" "$perlScriptFilePath" --owner "$j" -rel "$i" -m "$m" &
done
parallel $perlExecutablePath $perlScriptFilePath --owner $j -rel $i -m {} ::: "${mode[@]}"
这会在后台运行每个命令,因此不会等到一个命令完成后再启动下一个命令
另一种选择是查看,它是为此目的而设计的。使用GNU并行,它看起来像这样:
for m in "${mode[@]}"
do
"$perlExecutablePath" "$perlScriptFilePath" --owner "$j" -rel "$i" -m "$m" &
done
parallel $perlExecutablePath $perlScriptFilePath --owner $j -rel $i -m {} ::: "${mode[@]}"
GNU Parallel是一个通用的并行程序,它使得在同一台机器上或在您有ssh访问权的多台机器上并行运行作业变得非常容易。它通常可以代替for
循环
如果您有32个不同的作业要在4个CPU上运行,并行化的直接方法是在每个CPU上运行8个作业:
GNU Parallel会在完成时生成一个新进程—使CPU保持活动状态,从而节省时间:
安装
如果您的发行版没有打包GNU Parallel,那么您可以进行个人安装,而不需要root访问。通过执行以下操作,可在10秒内完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
有关其他安装选项,请参阅
了解更多信息
请参阅更多示例:
观看介绍视频:
浏览本教程:
注册电子邮件列表以获得支持:感谢Tom的努力