GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So leiten Sie die Ausgabe in eine Datei und stdout um

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


Linux
  1. So leiten Sie die Ausgabe in eine Datei und Stdout in Linux um

  2. Wie leite ich die Ausgabe eines Programms in eine Zip-Datei um?

  3. Ausgabe nach Stdout und gleichzeitig Grep in eine Datei?

  4. So leiten Sie die Ausgabe eines bereits laufenden Prozesses um

  5. Leiten Sie die gesamte Ausgabe in eine Datei in Bash um

So leiten Sie stderr in Bash auf stdout um

So leiten Sie die Shell-Befehlsausgabe um

Befehlsausgabeumleitung auf Datei und Terminal

So leiten Sie die Ausgabe des systemd-Dienstes in eine Datei um

bash:leite stderr auf Datei und stdout + stderr auf Bildschirm um

Erfassen von STDERR und STDOUT in einer Datei mit tee