Die akzeptierte Antwort behält STDERR nicht als separaten Dateideskriptor bei. Das bedeutet
./script.sh >/dev/null
wird nicht baran das Terminal ausgegeben , sondern nur an die Protokolldatei, und
./script.sh 2>/dev/null
gibt beide foound baran das Terminal aus. Dies ist eindeutig nicht das Verhalten, das ein normaler Benutzer wahrscheinlich erwartet. Dies kann behoben werden, indem zwei separate Tee-Prozesse verwendet werden, die beide an dieselbe Protokolldatei angehängt werden:
#!/bin/bash
# See (and upvote) the comment by JamesThomasMoon1979
# explaining the use of the -i option to tee.
exec > >(tee -ia foo.log)
exec 2> >(tee -ia foo.log >&2)
echo "foo"
echo "bar" >&2
(Beachten Sie, dass das oben Gesagte die Protokolldatei zunächst nicht abschneidet. Wenn Sie dieses Verhalten wünschen, sollten Sie es hinzufügen
>foo.log
an den Anfang des Skripts.)
Die POSIX.1-2008-Spezifikation vontee(1) verlangt, dass die Ausgabe ungepuffert ist, dh nicht einmal zeilengepuffert. In diesem Fall ist es also möglich, dass STDOUT und STDERR in derselben Zeile von enden foo.log. jedoch könnte das auch auf dem Terminal passieren, so dass die Protokolldatei ein getreues Abbild der sein wird , was könnte auf dem Terminal zu sehen ist, wenn kein exakter Spiegel davon. Wenn Sie möchten, dass die STDOUT-Zeilen sauber von den STDERR-Zeilen getrennt werden, sollten Sie zwei Protokolldateien verwenden, möglicherweise mit Datumsstempelpräfixen in jeder Zeile, um später einen chronologischen Zusammenbau zu ermöglichen.