Ich gehe davon aus, dass Sie STDERR und STDOUT weiterhin auf dem Terminal sehen möchten. Sie könnten sich für Josh Kelleys Antwort entscheiden, aber ich finde es tail
sehr hackisch und ungeschickt , ein Hintergrundbild im Hintergrund zu haben, das Ihre Protokolldatei ausgibt. Beachten Sie, wie Sie ein Exra-FD behalten und anschließend bereinigen müssen, indem Sie es töten, und technisch sollten Sie dies in einem tun trap '...' EXIT
.
Es gibt einen besseren Weg, dies zu tun, und Sie haben es bereits entdeckt : tee
.
Nur, anstatt es nur für Ihr stdout zu verwenden, haben Sie ein T-Stück für stdout und eines für stderr. Wie werden Sie dies erreichen? Prozessersetzung und Dateiumleitung:
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
Lassen Sie es uns aufteilen und erklären:
> >(..)
>(...)
(Prozessersetzung) erstellt ein FIFO und lässt es tee
abhören. Anschließend wird >
(STDOUT) mithilfe von (Dateiumleitung) command
an das FIFO umgeleitet, das Ihr erster Benutzer abhört tee
.
Gleiches gilt für die Sekunde:
2> >(tee -a stderr.log >&2)
Wir verwenden die Prozessersetzung erneut, um einen tee
Prozess zu erstellen, der aus STDIN liest und in diesen speichert stderr.log
. tee
gibt seinen Eingang wieder auf STDOUT aus, aber da sein Eingang unser STDERR ist, möchten wir den tee
STDOUT wieder auf unseren STDERR umleiten . Dann verwenden wir die Dateiumleitung , um command
den STDERR zum FIFO-Eingang ( tee
STDIN) umzuleiten.
Siehe http://mywiki.wooledge.org/BashGuide/InputAndOutput
Die Prozessersetzung ist eines der wirklich schönen Dinge, die Sie als Bonus für die Auswahl bash
Ihrer Shell im Gegensatz zu sh
(POSIX oder Bourne) erhalten.
In sh
müssten 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"