Bash shell中的并行赋值

Bash shell中的并行赋值,bash,shell,Bash,Shell,我有以下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 为什么?问题是,您必须将它们

我有以下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

为什么?

问题是,您必须将它们都放在后台(因此在两行的末尾都放上和和号),然后等待作业完成——如果不是,您不确定第一个作业是否在第二次迭代开始之前完成

第二个问题是,无法使用
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
for((i=1;i&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)和
等待

read x问题是,您必须将它们都放在后台(因此在两行的末尾都放上和和号),然后等待作业完成——如果没有,您不确定第一个作业是否在第二次迭代开始之前完成

第二个问题是,无法使用
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
for((i=1;i&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)和
等待

read x问题是,您必须将它们都放在后台(因此在两行的末尾都放上和和号),然后等待作业完成——如果没有,您不确定第一个作业是否在第二次迭代开始之前完成

第二个问题是,无法使用
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
for((i=1;i&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)和
等待

read x问题是,您必须将它们都放在后台(因此在两行的末尾都放上和和号),然后等待作业完成——如果没有,您不确定第一个作业是否在第二次迭代开始之前完成

第二个问题是,无法使用
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
for((i=1;i&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)和
等待

阅读x谢谢。这非常有效。我天真地希望得到更简单的东西,不涉及临时文件,但做不到。谢谢。这非常有效。我天真地希望得到更简单的东西,不涉及临时文件,但做不到。谢谢。这非常有效。我天真地希望得到更简单的东西,而不是涉及正在生成临时文件,但无法完成。谢谢。这非常有效。我天真地希望得到更简单的东西,不涉及临时文件,但无法完成。您可以将grep筛选器折叠到sed:
$1 bench 4 2>&1|sed-n'/Nodes\/second/s/*:\([0-9]*\)/\1/p'
您可以将grep筛选器折叠到sed:
$1 bench 4 2>&1 | sed-n'/Nodes\/second/s/*:\([0-9]*\)/\1/p'
您可以将grep筛选器折叠到sed:
$1 bench 4 2>&1 | sed-n'/Nodes\/s/*:\([0-9]*\)/\1/p'
您可以将grep筛选器折叠到sed:
$1 bench 4 2>$1 bench 4 2>&1*/second sed//\1/p'