Die akzeptierte Antwort behält STDERR nicht als separaten Dateideskriptor bei. Das bedeutet
./script.sh >/dev/null
wird nicht bar
an das Terminal ausgegeben , sondern nur an die Protokolldatei, und
./script.sh 2>/dev/null
gibt beide foo
und bar
an 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.