Bash - Gibt einen Wert vom untergeordneten Prozess an den übergeordneten Prozess zurück

Bash - Gibt einen Wert vom untergeordneten Prozess an den übergeordneten Prozess zurück

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_countaber 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_countund 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

verwandte Informationen