如何从Bash中的并行子shell获得结果?

时间:2016-08-17 00:39:53

标签: linux multithreading bash shell parallel-processing

我正在运行大约100个子shell并尝试回显它们的所有结果。代码:

#!/usr/bin/env bash
function some_function(){} #spider
# ... ...
for i in {1..100}
do
  array[$i]=some_function $i &
done
echo ${array[@]}

我知道这些评估发生在子壳中,所以我什么也得不到 但我不能用

echo $(some_function $i) &
循环中的

,因为赛车,这使得一切都变得不可读。

不知道为什么

(set -a; array[$i]=some_function $i; set +a)&

if true; then set -a; array[$i]=some_function $i; set +a; fi &

也不起作用。

我尽力避免在其他地方使用任何临时文件或fifo或fd。

这样做的正确方法是什么?

编辑:我想知道GNU-Parallel是否会起作用,尽管它不在msys2中。

1 个答案:

答案 0 :(得分:1)

子shell不能设置其父级的变量(或数组元素)的值。您唯一的选择是将输出写入文件。

for i in {1..100}; do
    some_function "$i" > "tmp_$i.txt" &
done

wait

for i in {1..100}; do
    array[i]=$(<"tmp_$i.txt")
done

(我认为可能有一种方法可以使用协同处理,但看起来你一次不能有多个协同处理。)