Sowohl stdout als auch stderr in eine einzige Datei umleiten
In diesem Schritt lernen Sie, wie Sie die gesamte Ausgabe eines Befehls – sowohl die Standardausgabe als auch den Standardfehler – in einer einzigen Datei erfassen. Dies ist besonders nützlich, wenn Sie eine vollständige Aufzeichnung der Ausführung eines Skripts oder Befehls wünschen, einschließlich aller aufgetretenen Fehler.
Verwenden wir einen Befehl, der sowohl stdout als auch stderr erzeugt. Wir versuchen, eine existierende Datei (/etc/passwd) und eine nicht existierende Datei (non_existent_file) aufzulisten.
ls -l /etc/passwd non_existent_file
Sie sehen zwei Arten von Ausgaben in Ihrem Terminal. Die erste Zeile ist der Standardfehler, die zweite die Standardausgabe.
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
Wenn Sie versuchen, dies nur mit > für stdout umzuleiten, erscheint die Fehlermeldung weiterhin auf dem Bildschirm.
ls -l /etc/passwd non_existent_file > output_only.txt
Ausgabe im Terminal:
ls: cannot access 'non_existent_file': No such file or directory
Und output_only.txt wird nur die Standardausgabe enthalten:
cat output_only.txt
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
Um beide Streams in eine Datei umzuleiten, können Sie den Operator &> verwenden. Dies ist eine praktische Kurzschreibweise, die sowohl stdout (Dateideskriptor 1) als auch stderr (Dateideskriptor 2) an die angegebene Datei sendet.
Probieren wir es aus. Wir leiten die gesamte Ausgabe in eine Datei namens combined.log um.
ls -l /etc/passwd non_existent_file &> combined.log
Diesmal wird nichts im Terminal ausgegeben. Die gesamte Ausgabe wurde in combined.log erfasst. Betrachten wir den Inhalt:
cat combined.log
Sie werden sehen, dass die Datei sowohl die Standardausgabe als auch den Standardfehler enthält:
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
Es gibt auch eine traditionellere, aber etwas komplexere Syntax, um dasselbe Ergebnis zu erzielen: > file 2>&1. Lassen Sie uns das aufschlüsseln:
> file: Dies leitet die Standardausgabe (Dateideskriptor 1) nach file um.
2>&1: Dies leitet den Standardfehler (Dateideskriptor 2) an denselben Ort wie die Standardausgabe (Dateideskriptor 1) um. Da stdout bereits nach file geht, wird stderr ebenfalls dorthin gesendet.
Versuchen wir diese Methode und speichern die Ausgabe in combined_traditional.log.
ls -l /etc/passwd non_existent_file > combined_traditional.log 2>&1
Auch hier erscheint keine Ausgabe im Terminal. Die Überprüfung des Dateiinhalts zeigt dasselbe Ergebnis:
cat combined_traditional.log
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
Während &> kürzer ist und oft bevorzugt wird, werden Sie 2>&1 häufig in älteren Skripten sehen, daher ist es wichtig zu verstehen, was es bewirkt. Um beide Streams anzuhängen, können Sie &>> oder >> file 2>&1 verwenden.