Der gewünschte Befehl heißt tee
:
foo | tee output.file
Wenn Sie sich zum Beispiel nur um stdout kümmern:
ls -a | tee output.file
Wenn Sie stderr einbinden möchten, tun Sie Folgendes:
program [arguments...] 2>&1 | tee outfile
2>&1
leitet Kanal 2 (stderr/Standardfehler) in Kanal 1 (stdout/Standardausgabe) um, sodass beide als stdout geschrieben werden. Ab tee
wird auch auf die angegebene Ausgabedatei umgeleitet Befehl.
Außerdem, wenn Sie anhängen möchten zur Protokolldatei, verwenden Sie tee -a
als:
program [arguments...] 2>&1 | tee -a outfile
$ program [arguments...] 2>&1 | tee outfile
2>&1
gibt die stderr- und stdout-Streams aus.tee outfile
nimmt den erhaltenen Stream und schreibt ihn auf den Bildschirm und in die Datei "outfile".
Das ist wahrscheinlich das, wonach die meisten Menschen suchen. Die wahrscheinliche Situation ist, dass ein Programm oder Skript lange Zeit hart arbeitet und viel Output produziert. Der Benutzer möchte den Fortschritt regelmäßig überprüfen, möchte aber auch, dass die Ausgabe in eine Datei geschrieben wird.
Das Problem (insbesondere beim Mischen von stdout- und stderr-Streams) besteht darin, dass man sich darauf verlässt, dass die Streams vom Programm geleert werden. Wenn zum Beispiel alle Schreibvorgänge auf stdout nicht sind gelöscht, aber alle Schreibvorgänge auf stderr sind gelöscht, dann landen sie in der Ausgabedatei und auf dem Bildschirm in falscher chronologischer Reihenfolge.
Es ist auch schlecht, wenn das Programm nur alle paar Minuten 1 oder 2 Zeilen ausgibt, um den Fortschritt zu melden. Wenn in einem solchen Fall die Ausgabe nicht vom Programm gelöscht würde, würde der Benutzer stundenlang keine Ausgabe auf dem Bildschirm sehen, da stundenlang nichts davon durch die Pipeline geschoben würde.
Update:Das Programm unbuffer
, Teil der expect
Paket, löst das Pufferungsproblem. Dadurch schreiben stdout und stderr sofort auf den Bildschirm und in die Datei und halten sie synchron, wenn sie kombiniert und an tee
umgeleitet werden . Beispiel:
$ unbuffer program [arguments...] 2>&1 | tee outfile
Ein anderer Weg, der für mich funktioniert, ist
<command> |& tee <outputFile>
wie im Gnu-Bash-Handbuch gezeigt
Beispiel:
ls |& tee files.txt
Wenn '|&' verwendet wird, der Standardfehler von command1 , zusätzlich zu seiner Standardausgabe , ist über die Pipe mit der Standardeingabe von command2 verbunden; es ist eine Kurzform für 2>&1 |. Diese implizite Umleitung des Standardfehlers zur Standardausgabe wird nach allen Umleitungen durchgeführt, die durch den Befehl angegeben werden.
Weitere Informationen finden Sie unter Umleitung