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:
- Die kombinierte Ausgabe von stdout und stderr in der Ausführungsreihenfolge (d. h. die obige Ausgabe).
- Nur die Standardausgabe
- 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 out
und err
wie gewünscht, aber die kombinierte Datei both
behä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 output
Funktion 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.