Umleiten von Standardfehlern und Kombinieren von Strömen
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.