Standardfehler umleiten und Ströme kombinieren
In diesem Schritt lernen Sie, wie Sie Standardfehler (stderr) umleiten und wie Sie stdout und stderr in einem einzigen Stream kombinieren. Dies ist entscheidend für die Verwaltung von Fehlermeldungen, die von Befehlen generiert werden, sodass Sie diese bei Bedarf protokollieren oder verwerfen können.
Denken Sie daran, dass stderr der Dateideskriptor 2 ist. Wir verwenden 2> zum Umleiten von Fehlermeldungen.
Umleiten von Standardfehlern in eine Datei
Manchmal erzeugen Befehle Fehlermeldungen, die Sie getrennt von ihrer Standardausgabe erfassen möchten.
-
Stellen Sie sicher, dass Sie sich in Ihrem Verzeichnis ~/project befinden.
cd ~/project
[labex@host project]$
-
Versuchen wir, den Inhalt eines nicht existierenden Verzeichnisses aufzulisten. Dies generiert eine Fehlermeldung.
ls non_existent_directory
ls: cannot access 'non_existent_directory': No such file or directory
Sie können die Fehlermeldung direkt auf dem Terminal sehen.
-
Leiten wir diese Fehlermeldung nun in eine Datei namens errors.log um.
ls non_existent_directory 2> errors.log
Dieses Mal sehen Sie die Fehlermeldung nicht auf Ihrem Terminal.
-
Überprüfen Sie den Inhalt von errors.log.
cat errors.log
ls: cannot access 'non_existent_directory': No such file or directory
Die Fehlermeldung wird jetzt in der Datei gespeichert.
Verwerfen von Standardfehlern
Oft möchten Sie möglicherweise einen Befehl ausführen, der störende Fehlermeldungen erzeugt, die Sie nicht interessieren. In solchen Fällen können Sie stderr nach /dev/null umleiten. /dev/null ist eine spezielle Gerätedatei, die alle Daten verwirft, die in sie geschrieben werden.
-
Versuchen Sie den Befehl ls erneut mit dem nicht existierenden Verzeichnis, aber verwerfen Sie diesmal den Fehler.
ls non_existent_directory 2> /dev/null
Sie sehen keine Ausgabe auf dem Terminal, und es wird keine Fehlermeldung in einer Datei gespeichert.
Kombinieren von Standardausgabe und Standardfehlern
Es gibt Situationen, in denen Sie sowohl stdout als auch stderr in derselben Datei erfassen möchten. Dies kann auf verschiedene Arten erfolgen.
Methode 1: > file 2>&1
Diese Methode leitet stdout in eine Datei um und leitet dann stderr an denselben Ort wie stdout um. Die Reihenfolge 2>&1 ist wichtig: Sie bedeutet "leite Dateideskriptor 2 (stderr) an denselben Ort wie Dateideskriptor 1 (stdout) um".
-
Erstellen wir einen Befehl, der sowohl Standardausgabe als auch Standardfehler erzeugt. Wir verwenden find, um nach einer Datei in einem Verzeichnis zu suchen, in dem wir Berechtigungen haben, und in einem Verzeichnis, in dem wir keine haben.
find ~/project /root -name "current_datetime.txt" > combined_output.log 2>&1
Hier erzeugt find ~/project -name "current_datetime.txt" stdout (falls gefunden), und find /root -name "current_datetime.txt" erzeugt wahrscheinlich stderr aufgrund von Berechtigungsproblemen.
-
Untersuchen Sie die Datei combined_output.log.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
Sie können sowohl die erfolgreiche Ausgabe (der Pfad zur Datei) als auch die Fehlermeldung in derselben Datei erfassen.
Methode 2: &> file (Bash-spezifisch)
Bash bietet eine Kurzschreibweise zum Kombinieren von stdout und stderr in einer Datei: &>. Dies entspricht > file 2>&1.
-
Versuchen wir denselben find-Befehl mit der Kurzschreibweise &>.
find ~/project /root -name "file_list.txt" &> combined_output_shorthand.log
-
Überprüfen Sie den Inhalt von combined_output_shorthand.log.
cat combined_output_shorthand.log
/home/labex/project/file_list.txt
find: ‘/root’: Permission denied
Das Ergebnis ist dasselbe wie bei der vorherigen Methode, was die Bequemlichkeit von &> demonstriert.
Anhängen von kombinierten Strömen
Genau wie bei stdout können Sie kombinierte stdout und stderr mit >> file 2>&1 oder &>> file an eine Datei anhängen.
-
Hängen Sie weitere Ausgaben und Fehler an combined_output.log an.
find ~/project /root -name "line_count.txt" >> combined_output.log 2>&1
-
Zeigen Sie die aktualisierte combined_output.log an.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
/home/labex/project/line_count.txt
find: ‘/root’: Permission denied
Die neue Ausgabe und die Fehler werden an den vorhandenen Inhalt angehängt.
Sie haben nun erfolgreich gelernt, wie Sie Standardfehler umleiten und wie Sie Standardausgabe und Standardfehler in einer einzigen Datei kombinieren. Dieses Wissen ist für robuste Skripterstellung und Systemadministrationsaufgaben unerlässlich.