Wie prüfe ich auf den Rückgabestatus von Pipe-Befehlen in der Ash-Shell?

335
hebbo

Wie kann ich die Rückgabecodes für Prozesse überprüfen, die in der Ascheschale aneinander geleitet werden?

Hier ist der Befehl, der mich interessiert:

dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz" 

Ich weiß auch, dass dies für die Bash-Shell (dh mit dem PIPESTATUS-Array) beantwortet wurde, aber meine Umgebung verwendet die Ash-Shell.

0

1 Antwort auf die Frage

1
Kamil Maciorowski

Ich weiß es ashüberhaupt nicht. Diese allgemeine Problemumgehung sollte auch funktionieren in sh:

psf=/tmp/pipestatus : > "$psf" # to make the file empty ( dd if=/my/block/device; echo "1 $?" >> "$psf" ) \ | ( ssh myuser@otherserver "gzip > file.gz"; echo "2 $?" >> "$psf" ) 

Dann prüfen Sie den Inhalt von /tmp/pipestatus. Es gibt einen Fehler: Race-Bedingung, die beiden ( )Blöcke laufen parallel, sie können in der Datei nicht in der richtigen Reihenfolge ausgegeben werden. Ich habe verwendet, >>damit keine Nachricht die andere überschreibt; Die "Nachrichten" sind kurz und sollten nicht verschachtelt werden. Ich habe die "Nachrichten" nummeriert. Wenn Sie also nicht in der richtigen Reihenfolge sind, können Sie die richtige Reihenfolge später abrufen ( sort, cut).

Der obige Code ist sowieso nur ein Beispiel. Eine robustere Lösung verwendet mktempzum Erstellen einer temporären Datei (en) printfanstelle von echo. Um die Race-Bedingung vollständig zu beseitigen, müssen Sie in separate Dateien schreiben :

psd="$(mktemp -d)" # you may want to check if the above command succeeded  ( dd if=/my/block/device; printf '%s\n' "$?" > "$psd/f1" ) \ | ( ssh myuser@otherserver "gzip > file.gz"; printf '%s\n' "$?" > "$psd/f2" )  # retrieve the results here, they are in "$psd/f1" and "$psd/f2"  rm -rf "$psd" unset psd 

Es ist nicht so gut wie das von Bash, PIPESTATUSweil es auf ein Dateisystem und die Fähigkeit angewiesen ist, dort zu schreiben. Nur wenige Dinge können schief gehen und werden nicht erwischt. Immer noch besser als nichts.

Hinweis: Ich werde jede Antwort besser bewerten als meine; insbesondere eine Antwort, bei der der Asche-spezifische * richtige * Weg (falls vorhanden) verwendet wird, um das Problem zu lösen. Wenn Sie eine solche Antwort schreiben, lassen Sie mich einen Kommentar unter meiner Antwort. Kamil Maciorowski vor 5 Jahren 0