Frage Wie man stderr in eine Datei umleitet


Diese Frage hat hier bereits eine Antwort:

Wenn Sie nohup verwenden, um einen Befehl im Hintergrund auszuführen, werden einige Inhalte im Terminal angezeigt.

cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

Ich möchte diesen Inhalt in einer Datei speichern.


161
2018-05-18 12:31


Ursprung




Antworten:


Es gibt zwei Haupt-Ausgabeströme in Linux (und anderen Betriebssystemen), Standardausgabe (stdout) und Standardfehler (stderr). Fehlermeldungen, wie die, die Sie anzeigen, werden nach Standardfehler gedruckt. Der klassische Umleitungsoperator (command > file) Leitet nur die Standardausgabe um, sodass der Standardfehler immer noch auf dem Terminal angezeigt wird. Um stderr auch umzuleiten, haben Sie einige Möglichkeiten:

  1. Umleiten von stdout zu einer Datei und stderr zu einer anderen Datei:

    command > out 2>error
    
  2. Stderr auf stdout umleiten (&1) und leiten Sie dann stdout in eine Datei um:

    command >out 2>&1
    
  3. Leiten Sie beide zu einer Datei um:

    command &> out
    

Weitere Informationen zu den verschiedenen Steuerungs- und Umleitungsoperatoren finden Sie unter Hier.


262
2018-05-18 12:50



Damit hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2> error_hashdeep.txt & oder hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2>&1 oder hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ &> result_mixed.txt - André M. Faria
@ AndréM.Faria ja. Aber die letzten beiden Befehle sind äquivalent, sie senden sowohl den Fehler als auch die Ausgabe an dieselbe Datei. - terdon♦
Wie in dem Link, den Sie angegeben haben, konnte ich | & anstelle von 2> & 1 verwenden, sie sind gleichwertig, danke für Ihre Zeit. - André M. Faria
Hi, ich konnte das vereinfachen zu: command 2> out. - Surya Teja Karra
@SuryaTejaKarra, das stderr nur umleitet, aber nicht stdout. - terdon♦


Das erste, was zu beachten ist, ist, dass es mehrere Möglichkeiten gibt, die von Ihrem Zweck und Ihrer Shell abhängen, daher erfordert dies ein geringes Verständnis mehrerer Aspekte. Am typischsten ist Via 2> im Bourne-artige Muscheln, sowie dash (das ist symlinked zu /bin/sh) und bash; Zum einen ist dies die standardmäßige und POSIX-konforme Shell, zum anderen verwenden die meisten Benutzer die interaktive Sitzung. Sie unterscheiden sich in Syntax und Funktionen, aber glücklicherweise funktioniert die Fehler - Stream - Umleitung gleich (außer der &> nicht Standard). Im Falle von csh und seinen Ableitungen die stderr-Umleitung funktioniert da nicht ganz.

Komm zurück zu 2> Teil. Zwei wichtige Dinge zu beachten: > bedeutet Redirector Operator, wo wir eine Datei öffnen und 2 Ganzzahl steht für stderr file descriptor; Genau so definiert der POSIX-Standard für Shell-Sprache die Umleitung in Abschnitt 2.7:

[n]redir-op word

Für einfach > Weiterleitung, die 1 Ganzzahl ist impliziert für stdout, d.h. echo Hello World > /dev/null ist genauso echo Hello World 1>/dev/null. Beachten Sie, dass der Integer- oder Umleitungsoperator nicht in Anführungszeichen gesetzt werden kann, da die Shell sie sonst nicht erkennt und stattdessen als literale Textzeichenfolge behandelt. Bezüglich des Abstands ist es wichtig, dass die Ganzzahl direkt neben dem Umleitungsoperator liegt, aber die Datei kann entweder neben dem Umleitungsoperator sein oder nicht, d.h. command 2>/dev/null und command 2> /dev/null wird gut funktionieren.

Die etwas vereinfachte Syntax für den typischen Befehl in der Shell wäre

 command [arg1] [arg2]  2> /dev/null

Der Trick dabei ist, dass die Umleitung überall erscheinen kann. Das ist beides 2> command [arg1] und command 2> [arg1] sind gültig. Beachten Sie, dass für bash Schale, dort existiert &> Möglichkeit, Stdout- und Stderr-Streams gleichzeitig umzuleiten, aber wiederum - es ist Bash-spezifisch und wenn Sie nach Portabilität von Skripten streben, funktioniert es möglicherweise nicht. Siehe auch Ubuntu Wiki und Was ist der Unterschied zwischen &> und 2> & 1?.

Hinweis: Das > Umleitungsoperator schneidet abeine Datei und überschreibt sie, wenn die Datei existiert. Das 2>> kann zum Anhängen verwendet werden stderr einordnen.

Wenn Sie vielleicht bemerken, > ist für einen einzigen Befehl gedacht. Bei Skripten können wir den Stederr-Stream des gesamten Skripts von außen umleiten wie in myscript.sh 2> /dev/null oder wir können davon Gebrauch machen Exec eingebaut. Die integrierte Exec hat die Macht, den Stream für die gesamte Shell-Sitzung sozusagen interaktiv oder über Skript neu zu verkabeln. Etwas wie

#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file

In diesem Beispiel sollte die Protokolldatei angezeigt werden stat: cannot stat '/etc/non_existing_file': No such file or directory.

Ein anderer Weg ist über Funktionen. Wie kopciuszek in seiner Antwort notiert, können wir Funktionsdeklaration mit bereits angehängter Umleitung schreiben, das heißt

some_function(){
    command1
    command2
} 2> my_log_file.txt

4
2018-05-03 07:48