Zusammenführen von stdout und stderr und Erstellen von Kopien von jedem separat

Zusammenführen von stdout und stderr und Erstellen von Kopien von jedem separat

Mein Ziel lässt sich am besten anhand eines Beispiels erklären. Zunächst einmal hier eine Funktion, die sowohl auf stdout als auch auf stderr eine Beispielausgabe erzeugt:

output() {
  printf '%s\n' 1 2
  printf '%s\n' errA errB 1>&2
  printf '%s\n' 3 4
}

Wenn Sie dies alleine ausführen, werden beide Streams in der Reihenfolge ihrer Ausführung im Terminal ausgegeben:

$ output
1
2
errA
errB
3
4

Diese Funktion ist nun lediglich ein Platzhalter, der die Ausgabe (stdout und stderr) eines beliebigen Skripts darstellt, das wir protokollieren möchten. Genauer gesagt möchten wir drei verschiedene Protokolle erstellen:

  1. Die kombinierte Ausgabe von stdout und stderr in der Ausführungsreihenfolge (d. h. die obige Ausgabe).
  2. Nur die Standardausgabe
  3. Nur die stderr-Ausgabe

Die beste Lösung, die mir eingefallen ist, ist diese:

$ { output > >(tee out) 2> >(tee err >&2); } > both 2>&1
$ ls
both  err  out
$ cat both
errA
errB
1
2
3
4
$ cat out
1
2
3
4
$ cat err
errA
errB

Wie Sie sehen, sind die Dateien outund errwie gewünscht, aber die kombinierte Datei bothbehält die Ausführungsreihenfolge nicht bei.

Gibt es eine Möglichkeit, die 3 gewünschten Protokolldateien gleichzeitig zu erstellen?

Als Bonusfrage: Ist die Ausgabe in der Ausführungsreihenfolge tatsächlich garantiert, wenn die outputFunktion allein ausgeführt wird? Ich habe es viele Male versucht und die gemischte Standardausgabe und Standardfehlerausgabe im Terminal sind immer gleich und in der richtigen Reihenfolge. Aber das ist nicht dasselbe wie eine Garantie.

verwandte Informationen