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 tailsehr 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 teeabhören. Anschließend wird >(STDOUT) mithilfe von (Dateiumleitung) commandan 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 teeProzess zu erstellen, der aus STDIN liest und in diesen speichert stderr.log. teegibt seinen Eingang wieder auf STDOUT aus, aber da sein Eingang unser STDERR ist, möchten wir den teeSTDOUT wieder auf unseren STDERR umleiten . Dann verwenden wir die Dateiumleitung , um commandden STDERR zum FIFO-Eingang ( teeSTDIN) 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 bashIhrer Shell im Gegensatz zu sh(POSIX oder Bourne) erhalten.
In shmü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"