
Ich verwende den folgenden Code
record_count=0
task()
{
while read -r record ; do
record_count=$(( record_count + 1 ))
.....
done < $1
}
for i in {1..5}; do
task $i &
done
wie kann ich den Datensatzzähler von der untergeordneten Shell/dem untergeordneten Prozess zur übergeordneten Shell/dem übergeordneten Prozess verwenden. Ich habe es versucht, return record_count
aber es funktioniert nicht. Gibt es eine andere Möglichkeit, die Werte zurückzugeben (wenn möglich mehrere Werte zurückzugeben)?
Antwort1
„return“ ist für den Exit-Code, normalerweise bedeutet „0“ Erfolg und alles andere einen Fehler. Und es muss eine Ganzzahl kleiner als 256 sein, also ist es im Allgemeinen nicht nützlich, um die Art von Ergebnissen zurückzugeben, die hier erwartet werden.
Aber Ihre Unterprozesse können ihre Ergebnisse als Text ausgeben und der Hauptprozess kann diese Ergebnisse dann optional erfassen:
record_count=0
task()
{
while read -r record
do
record_count=$(( record_count + 1 ))
done <$1
echo $record_count
}
(
for i in {1..5}
do
task $i &
done
wait
) \
| sort
Durch das „Warten“ wird sichergestellt, dass alle Unterprozesse abgeschlossen sind, bevor fortgefahren wird.
Beachten Sie, dass bei parallelen Prozessen keine Garantie für die Reihenfolge besteht, in der sie abgeschlossen werden. Die Ergebnisse werden also nicht unbedingt in der Reihenfolge 1, 2, 3, 4, 5 angezeigt.
Wenn diese zufällige Reihenfolge ein Problem darstellt, könnte das Programm der Aufgabe einen „Schlüssel“ übergeben, und dieser Schlüssel könnte zum Sortieren der Ausgabe verwendet werden. In diesem Fall könnte $i selbst der Schlüssel sein, aber im Allgemeinen sind die Dateinamen keine einfachen Ganzzahlen.
Antwort2
Sie können es nur verwenden return record_count
und erhalten ein korrektes Ergebnis, wenn die Zahl zwischen 0 und 255 liegt. Und Sie sollten den Rückgabecode folgendermaßen verwenden:
for i in {1..5}; do
task $i ; echo $?
done