Erfassen von STDERR und STDOUT in Datei mit Tee

14

Ich bin mir nicht sicher, wie ich am besten beide STDERRund STDOUTdieselbe Datei mit erfassen soll tee. Ich weiß, dass ich, wenn ich zu einer Datei leiten möchte, das Dateihandle nach der Umleitung zuordnen muss, d. H.

find . >/tmp/output.txt 2>&1

Dies weist die Schale zu senden STDOUTan /tmp/output.txtund dann zu senden , STDERRum STDOUT(das nun das Senden /tmp/output.txt).

Der Versuch, das auszuführen, 2>&1bevor die Datei umgeleitet wird, hat nicht den gewünschten Effekt.

Wenn ich jedoch Pipe verwenden möchte, teesollte es sein:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?
PP.
quelle

Antworten:

16

Letzteres; es stellt sicher, dass STDOUT und STDERR des ursprünglichen Befehls zum gleichen fd gehen, und füttert sie dann gemeinsam in tee. Im ersteren Fall ist es der STDERR des Tee-Befehls, den Sie mit seinem STDOUT verbinden würden.

MadHatter
quelle
5
Interessanterweise heißt es auf der Bash-Manpage: "Wenn |&verwendet, wird der Standardfehler von Befehl1 über die Pipe mit der Standardeingabe von Befehl2 verbunden 2>&1 |. Dies ist eine Abkürzung für . Diese implizite Umleitung des Standardfehlers wird nach allen durch den Befehl angegebenen Umleitungen ausgeführt."
PP.
Ich musste ein kleines C-Programm erstellen, das sowohl in das stderrals auch stdoutin dieses Problem schreibt . Die Umleitungs- >und Tee- |Operatoren unterscheiden sich, wenn versucht wird, beide Ausgabestreams zu erfassen. Für die Umleitung musste ich ./testapp > /tmp/out.log 2>&1. Während für Tee musste ich ./testapp 2>&1 | tee /tmp/out.log.
typelogic
@daixtr für das, was es wert ist, wird das |normalerweise als Rohrbetreiber bezeichnet. teebezieht sich nur auf das bestimmte Programm, das am anderen Ende der Pipe aufgerufen wird.
MadHatter