Wie stderr in eine Datei umgeleitet wird

149

Während nohup einen Befehl zum Ausführen im Hintergrund verwendet, 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.

    
André M. Faria 18.05.2015, 14:31

2 Antworten

242

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 ebenfalls umzuleiten, haben Sie einige Möglichkeiten:

  1. Leiten Sie stdout in eine Datei und stderr in eine andere Datei um:

    command > out 2>error
    
  2. Leiten Sie stderr in stdout um ( &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 hier .

    
terdon 18.05.2015, 14:50
4

Als erstes ist zu beachten, dass es mehrere Möglichkeiten gibt, die von Ihrem Zweck und Ihrer Shell abhängen, daher erfordert dies ein leichtes Verständnis mehrerer Aspekte. Am typischsten ist dies über 2> in Bourne-artigen Shells , z. B. dash (das mit /bin/sh verknüpft ist) 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-One). Im Fall von csh und seinen Derivaten funktioniert die stderr-Umleitung dort nicht ganz.

Kommen wir zurück zu 2> part. Zwei wichtige Dinge zu bemerken: > bedeutet Umleitungsoperator, wo wir eine Datei öffnen und 2 integer 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 die einfache > Umleitung wird die 1 Ganzzahl für stdout impliziert, d. h. echo Hello World > /dev/null ist genau dasselbe wie 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 ist, aber die Datei kann entweder neben dem Umleitungsoperator sein oder nicht, d.h. command 2>/dev/null und command 2> /dev/null werden 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 sowohl 2> command [arg1] als auch command 2> [arg1] sind gültig. Beachten Sie, dass es für bash shell auch &> way gibt, um 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 & amp; & gt; und 2 & amp; 1 .

Hinweis: Der > Umleitungsoperator schneidet eine Datei ab und überschreibt sie, wenn die Datei vorhanden ist. Der 2>> kann zum Anhängen von stderr an Datei verwendet werden.

Wenn Sie vielleicht bemerken, > ist für einen einzigen Befehl gedacht. Für Skripts können wir den stderr-Stream des gesamten Skripts von außen wie in myscript.sh 2> /dev/null umleiten oder wir können exec . 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 stat: cannot stat '/etc/non_existing_file': No such file or directory anzeigen.

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

some_function(){
    command1
    command2
} 2> my_log_file.txt
    
Sergiy Kolodyazhnyy 03.05.2018 09:48

Tags und Links