(möglicherweise im Zusammenhang mit Do some programs not accept process substitution for input files?)Bash Prozess Substitution und Synchronisieren
In einigen Bash Unit-Test-Skripte ich die folgenden Trick mit und Anzeige stdout und stderr eines Befehls zu protokollieren:
command > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
Dieser Prozess erzeugt eine Ausgabe zu stdout, so dass die Datei $stdoutF
einige Daten erhält. Dann laufe ich einen anderen Befehl, der alle Daten, nicht ausgibt:
diff -r "$source" "$target" > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
jedoch
, es sieht nicht wie dieser Prozess immer beendet erfolgreich, bevor der Test für Leere ausgeführt wird (mit shunit-ng):
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
In einem 100-Lauf-Test ist dies 25 Mal fehlgeschlagen.
Sollte es ausreichend sein, sync
aufrufen, bevor die Datei für die Leere Prüfung:
sync
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
... und/oder sollte es funktionieren, indem die Reihenfolge der Befehle zwingen:
diff -r "$source" "$target" \
> >(tee "${stdoutF}"; assertNull 'Unexpected output to stdout' "$(<"$stdoutF")")
2> >(tee "${stderrF}" >&2)
. .. und/oder ist es möglich, tee
es irgendwie zu assertNull
direkt anstelle einer Datei?
Aktualisieren: sync
ist nicht die Antwort - Siehe Gilles Antwort unten.
Update 2: Diskussion weiter zu Save stdout, stderr and stdout+stderr synchronously. Danke für die Antworten!
Dank für diese tolle Antwort, dies hat mich nur eine bessere Admin! –