Wie kann man stdout + stderr in eine Datei umleiten, während die Streams getrennt bleiben?

Das Umleiten von stdout + stderr, sodass beide in eine Datei geschrieben werden, während sie weiterhin in stdout ausgegeben werden, ist einfach genug:

cmd 2>&1 | tee output_file

Aber dann kommen jetzt beide stdout / stderr von cmd auf stdout. Ich möchte stdout + stderr in dieselbe Datei schreiben (die Reihenfolge bleibt also erhalten, vorausgesetzt, cmd ist Single-Threaded), aber ich kann sie dann auch separat umleiten, in etwa wie folgt:

some_magic_tee_variant combined_output cmd > >(command-expecting-stdout) 2> >(command-expecting-stderr)

Also enthält combined_output die beiden, wobei die Reihenfolge beibehalten wird, aber das Kommando-Expecting-Stdout bekommt nur stdout und das Kommando-Expecting-Stderr bekommt nur stderr. Grundsätzlich möchte ich stdout + stderr protokollieren, während stdout und stderr weiterhin separat umgeleitet und weitergeleitet werden können. Das Problem mit dem Tee-Ansatz ist, dass er sie zusammenwirbelt. Gibt es eine Möglichkeit, dies in bash / zsh zu tun?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage