2016-08-17 8 views
0

私は約100のサブシェルを実行しており、それらのすべての結果をエコーし​​ようとしています。コード:Bashの並列サブ・シェルの結果を得るには?

#!/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

GNU 'parallel'は、バックグラウンド・プロセスを起動するだけで、別の方法です。それ自身は*別の外部プロセスなので、呼び出し側シェルにシェル変数を設定することはできません。 – chepner

答えて

1

サブシェルは、その親の変数(または配列要素)の値を設定できません。唯一の選択肢は、出力をファイルに書き込むことです。

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 

(私はcoprocessesを使用する方法があるかもしれないと思ったが、それはあなたが一度に複数のコプロセスを持つことはできません表示されます。)

+0

ファイル/ fifo/fdをロックし、順番に書き込みをする、または参照によって変数を渡すのはどうですか? – Schezuk

+0

Err ...配列の要素が1つずつ評価されるので、fifoがサブシェルをブロックするのかどうか疑問です。 – Schezuk

+1

単一のファイル(通常ファイルまたはFIFO)を使用すると、同じ競合状態になります。 – chepner

関連する問題