Ich gehe davon aus, dass Sie weiterhin Standardfehler und Standardausgaben auf dem Terminal sehen wollen. Sie könnten sich für Die Antwort von Josh Kelley aber ich finde, dass man einen tail
im Hintergrund, die Ihre Protokolldatei sehr hakelig und unübersichtlich ausgibt. Beachten Sie, dass Sie eine zusätzliche Dateideskriptor und danach aufräumen, indem man sie tötet, und das sollte technisch in einem trap '...' EXIT
.
Es gibt einen besseren Weg, dies zu tun, und Sie haben ihn bereits entdeckt: tee
.
Nur, anstatt es nur für die Standardausgabe zu verwenden, haben Sie ein T-Stück für die Standardausgabe und eines für den Standardfehler. Wie werden Sie dies erreichen? Prozess-Substitution und Datei-Umleitung:
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
Lassen Sie uns das aufteilen und erklären:
> >(..)
>(...)
(Prozess-Substitution) schafft ein FIFO und lässt tee
anhören. Dann verwendet es >
(Datei-Umleitung), um die Standardausgabe von command
an das FIFO, dass Ihre erste tee
hört zu.
Das Gleiche gilt für die zweite:
2> >(tee -a stderr.log >&2)
Wir verwenden wieder die Prozesssubstitution, um eine tee
Prozess, der von der Standardeingabe liest und die Daten in stderr.log
. tee
gibt seine Eingabe zurück auf die Standardausgabe, aber da seine Eingabe unser Standardfehler ist, wollen wir die tee
Standardausgabe wieder in unseren Standardfehler. Dann benutzen wir die Datei-Umleitung, um die command
Standardfehler des FIFO an den Eingang ( tee
der Standardeingabe).
参照 Eingabe und Ausgabe
Die Prozess-Substitution ist eine der wirklich schönen Dinge, die man als Bonus erhält, wenn man Bash als Shell wählt, im Gegensatz zu sh
(POSIX oder Bourne).
Unter sh
müssen Sie die Dinge manuell erledigen:
out="${TMPDIR:-/tmp}/out.$$" err="${TMPDIR:-/tmp}/err.$$"
mkfifo "$out" "$err"
trap 'rm "$out" "$err"' EXIT
tee -a stdout.log < "$out" &
tee -a stderr.log < "$err" >&2 &
command >"$out" 2>"$err"