在 bash 中并行设置变量



下面是一个示例程序:

#!/bin/bash
for x in {1..5}
do
  output[$x]=$(echo $x) &
done
wait
for x in {1..5}
do
  echo ${output[$x]}
done

我希望它运行并打印出分配给 output 数组每个成员的值,但它不打印任何内容。删除&可以正确分配变量。我必须使用不同的语法来并行实现这一点吗?

output[$x]=$(echo $x) &

整个分配放在后台任务(子流程)中,这就是您看不到结果的原因,因为它不会传播到父流程。

您可以使用等待来等待子进程,但返回结果(状态代码除外)将很困难。也许您可以将中间结果写入文件,并在所有进程完成后收集这些结果?(不好,我很欣赏)

如果要避免写入文件,可以使用GNU parallel

#!/bin/bash
output=(`parallel -k --gnu echo {1} ::: {1..5}`)
for i in ${output[@]}
do
   echo $i
done

-k是保留输出的顺序

使用 GNU Parallel 中的 parset

#!/bin/bash
typeset -A output
parset output echo {} ::: {1..5}
for x in {1..5}
do
  echo ${output[$x]}
done

最新更新