2016-08-17 2 views
0

Ich laufe etwa 100 Sub-Shells und versuche, alle Ergebnisse von ihnen zu echo. Code:Wie bekomme ich Ergebnisse von parallelen Sub-Shells in Bash?

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

Ich weiß, dass diese Bewertungen in Unterschalen passieren, so nichts werde ich bekommen.
Aber ich kann

echo $(some_function $i) & 

in der Schleife nicht stattdessen verwenden, wegen Rennen, die nicht lesbar alles gemacht.

Keine Ahnung, warum

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

oder

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

auch nicht funktioniert.

Ich habe mein Bestes getan, um zu vermeiden, irgendwelche Temp-Datei oder Fifo oder Fd woanders zu verwenden.

Was ist der richtige Weg, es zu tun?

Edit: Ich frage mich, ob GNU-Parallel funktioniert, obwohl es nicht in msys2 ist.

+1

GNU 'parallel' nur ein weiterer Weg ist Hintergrundprozess zu beginnen; it * selbst * ist ein weiterer externer Prozess und kann daher keine Shell-Variablen in der aufrufenden Shell setzen. – chepner

Antwort

1

Eine Subshell kann den Wert einer Variablen (oder eines Array-Elements) des übergeordneten Elements nicht festlegen. Ihre einzige Option besteht darin, die Ausgabe in eine Datei zu schreiben.

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 

(Ich dachte, es könnte ein Weg sein Koprozesse zu verwenden, aber es scheint, dass Sie nicht mehr als eine Koprozeß zu einem Zeitpunkt haben können.)

+0

Wie wäre es, eine Datei/fifo/fd zu sperren und reihum zu schreiben oder eine Variable als Referenz zu übergeben? – Schezuk

+0

Err ... Ich frage mich, ob die Verwendung von Fifo die Unterschalen blockiert, da Elemente des Arrays nacheinander ausgewertet werden? – Schezuk

+1

Jede einzelne Datei (normale Datei oder Fifo) gibt Ihnen die gleiche Wettlaufbedingung. – chepner

Verwandte Themen