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 mktemp
zum Erstellen einer temporären Datei (en) printf
anstelle 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, PIPESTATUS
weil 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.