我有以下bash脚本:
for (( i = 1; i <= $3; i++ ))
do
x=$($1 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/") &
y=$($2 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/")
echo $x, $y
done
我用3个参数运行:
$($1 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/")
是一个数字。关键是我想并行运行x=...
和y=...
,这就是为什么我使用&符的原因。这很重要,必须以这种方式进行并行化(对x和y运行第一次迭代,在第二次迭代之前等待两者都完成,等等)
该脚本的结果是未分配x,仅y是:
$ ./bench.sh ./Stockfish/cerr ./Stockfish/master 50
, 2417071
, 2440128
, 2439481
etc.
为什么?
问题是您必须将它们都放在后台(因此在两行的末尾放置和号),然后wait
才能完成作业-否则,您不确定在第二次迭代开始之前第一项工作是否完成。
第二个问题是您无法使用来从后台作业中获取输出x$(...)&
,因此您将不得不将输出重定向到文件,然后在作业完成后读取文件输出。
for (( i = 1; i <= $3; i++ ))
do
($1 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/" >/tmp/x) &
($2 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/" >/tmp/y) &
wait
read x </tmp/x
read y </tmp/y
echo $x, $y
done
另外,作为额外的奖励,请尝试阅读手册页,以获取xargs
-在大多数情况下,这种循环非常不必要,而且更加安全。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句