我正在运行大约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中。
答案 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
(我认为可能有一种方法可以使用协同处理,但看起来你一次不能有多个协同处理。)