Eingabe- und Ausgabeweiterleitung in Linux

CompTIACompTIABeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einleitung

In diesem Labor lernen Sie die grundlegenden Techniken zur Umleitung von Ein- und Ausgaben in der Linux-Shell. Sie werden untersuchen, wie Sie den Datenfluss von Befehlen steuern, indem Sie die drei Standardströme manipulieren: Standardausgabe (stdout), Standardfehlerausgabe (stderr) und Standardeingabe (stdin). Dieses Labor bietet praktische Übungen mit wesentlichen Umleitungsoperatoren, die es Ihnen ermöglichen, die Ausgabe von Befehlen zu speichern, Fehlermeldungen zu verwalten und Eingaben für Befehle aus Dateien bereitzustellen.

Während der Übungen verwenden Sie den Operator > , um die Ausgabe von Befehlen in eine Datei zu senden und vorhandene Inhalte zu überschreiben, und den Operator >> , um die Ausgabe anzuhängen, ohne Daten zu verlieren. Sie lernen auch, Fehlermeldungen gezielt mit 2> umzuleiten und wie Sie sowohl Standardausgabe als auch Standardfehlerausgabe in einer einzigen Datei kombinieren. Schließlich verwenden Sie den Befehl tee , um die Ausgabe gleichzeitig auf dem Bildschirm anzuzeigen und in einer Datei zu speichern, und üben die Umleitung der Standardeingabe mit dem Operator < , damit ein Befehl aus einer Datei und nicht von der Tastatur liest.

Standardausgabe mit dem Operator > umleiten

In diesem Schritt lernen Sie, wie Sie die Standardausgabe eines Befehls umleiten. In einer Linux-Shell erzeugen die meisten Befehle eine Ausgabe. Standardmäßig wird diese Ausgabe, bekannt als "Standardausgabe" (oder stdout), auf Ihrem Terminalbildschirm angezeigt. Sie können diese Ausgabe jedoch mit dem Operator > in eine Datei umleiten. Dies ist nützlich, um Befehlsergebnisse zu speichern, Protokolldateien zu erstellen oder Berichte zu generieren.

Zuerst führen wir einen einfachen Befehl aus und sehen seine Ausgabe auf dem Terminal.

echo "Hello from LabEx"

Sie sollten die folgende Ausgabe direkt in Ihrem Terminal sehen:

Hello from LabEx

Nun leiten wir diese Ausgabe stattdessen in eine Datei um. Wir verwenden den Operator > gefolgt von einem Dateinamen. Dies weist die Shell an, die Ausgabe des echo-Befehls in eine Datei namens hello.txt in Ihrem aktuellen Verzeichnis (~/project) zu senden.

Führen Sie den folgenden Befehl aus:

echo "Hello from LabEx" > hello.txt

Beachten Sie, dass diesmal keine Ausgabe auf dem Terminal angezeigt wird. Das liegt daran, dass die Ausgabe in die Datei hello.txt gesendet wurde. Sie können den Inhalt der Datei mit dem Befehl cat überprüfen:

cat hello.txt

Die Ausgabe zeigt den umgeleiteten Text an:

Hello from LabEx

Der Operator > erstellt die Datei, falls sie nicht existiert. Seien Sie vorsichtig, wenn die Datei bereits existiert, überschreibt der Operator > deren gesamten Inhalt ohne Vorwarnung. Sehen wir uns das in Aktion an.

Zuerst listen wir den Inhalt des aktuellen Verzeichnisses auf und speichern ihn in einer neuen Datei namens file_list.txt.

ls -l > file_list.txt

Zeigen Sie nun den Inhalt von file_list.txt an:

cat file_list.txt

Sie sehen eine Auflistung der Dateien in Ihrem Projektverzeichnis, die etwa so aussehen sollte:

total 4
-rw-rw-r-- 1 labex labex  0 Jun 25 14:56 file_list.txt
-rw-rw-r-- 1 labex labex 17 Jun 25 14:56 hello.txt

Führen wir nun einen anderen Befehl aus und leiten dessen Ausgabe in dieselbe Datei, file_list.txt, um.

echo "This is new content." > file_list.txt

Wenn Sie den Inhalt von file_list.txt erneut überprüfen, werden Sie feststellen, dass die ursprüngliche Dateiliste ersetzt wurde.

cat file_list.txt

Die Ausgabe lautet nun:

This is new content.

Dies demonstriert das Überschreibungsverhalten des Operators >. Im nächsten Schritt lernen Sie, wie Sie Ausgaben an eine Datei anhängen, ohne sie zu überschreiben.

Standardausgabe mit dem Operator >> anhängen

In diesem Schritt lernen Sie, wie Sie Ausgaben an das Ende einer Datei anhängen, ohne deren vorhandenen Inhalt zu löschen. Im vorherigen Schritt haben Sie gesehen, dass der Operator > die Zieldatei überschreibt. Um dies zu vermeiden, können Sie den Anhänge-Operator >> verwenden. Dieser Operator ist äußerst nützlich für Aufgaben wie die Pflege einer laufenden Protokolldatei, in die Sie im Laufe der Zeit neue Einträge hinzufügen möchten.

Beginnen wir mit der Erstellung einer Datei mit einigen anfänglichen Inhalten. Wir nennen sie greetings.txt.

echo "Hello, this is the first line." > greetings.txt

Überprüfen Sie nun den Inhalt:

cat greetings.txt

Die Ausgabe sollte sein:

Hello, this is the first line.

Als Nächstes hängen wir, anstatt die Datei zu überschreiben, eine neue Zeile mit dem Operator >> an.

echo "This is the second line, appended." >> greetings.txt

Überprüfen Sie den Inhalt von greetings.txt erneut.

cat greetings.txt

Diesmal sehen Sie, dass die neue Zeile nach dem ursprünglichen Inhalt hinzugefügt wurde:

Hello, this is the first line.
This is the second line, appended.

Der Operator >> ist perfekt für die Erstellung von Protokolldateien. Erstellen wir eine einfache Protokolldatei namens activity.log und fügen ihr mit dem Befehl date einen Zeitstempel hinzu.

date > activity.log

Fügen wir nun einen weiteren Zeitstempel an dieselbe Datei an.

date >> activity.log

Sehen Sie sich die endgültige Datei activity.log an, um beide Einträge zu sehen.

cat activity.log

Die Ausgabe zeigt zwei Zeitstempel, was zeigt, dass der zweite Befehl seine Ausgabe angehängt und die Datei nicht überschrieben hat. Die genauen Zeiten können variieren.

Wed Jun 25 14:56:53 CST 2025
Wed Jun 25 14:56:56 CST 2025

Dies zeigt, wie >> vorhandene Daten beibehält und neue Daten am Ende einer Datei hinzufügt, was es zu einer sicheren Methode macht, Dateien mit neuen Informationen zu aktualisieren.

Standardfehler mit dem Operator 2> umleiten

In diesem Schritt lernen Sie, wie Sie Fehlermeldungen verwalten. Neben der Standardausgabe (stdout) erzeugen Befehle auch eine andere Art von Ausgabe, die als "Standardfehler" (stderr) bezeichnet wird. Dies ist ein separater Stream, der speziell für Fehlermeldungen und Diagnosen verwendet wird. Standardmäßig werden sowohl stdout als auch stderr auf Ihrem Terminal angezeigt, aber die bisher erlernten Umleitungsoperatoren (> und >>) beeinflussen nur stdout.

Um stderr umzuleiten, müssen Sie dessen Dateideskriptor angeben, der 2 ist. Der Operator > ist eigentlich eine Kurzform für 1>, wobei 1 der Dateideskriptor für stdout ist. Um also stderr umzuleiten, verwenden Sie 2>.

Lassen Sie uns einen Fehler generieren, um dies in Aktion zu sehen. Wir versuchen, eine Datei aufzulisten, die nicht existiert.

ls non_existent_file

Dieser Befehl schlägt fehl und gibt eine Fehlermeldung auf Ihrem Terminal aus:

ls: cannot access 'non_existent_file': No such file or directory

Versuchen wir nun, dies mit dem Standardoperator > umzuleiten.

ls non_existent_file > output.txt

Beachten Sie, dass die Fehlermeldung immer noch auf dem Terminal ausgegeben wird. Der Operator > hat sie nicht erfasst. Wenn Sie die Datei output.txt überprüfen, werden Sie feststellen, dass sie leer ist.

cat output.txt

Der Befehl erzeugt keine Ausgabe, da keine Standardausgabe generiert wurde, nur Standardfehler.

Leiten wir nun korrekt den Standardfehler mit 2> in eine Datei namens error.log um.

ls non_existent_file 2> error.log

Diesmal erscheint keine Meldung auf dem Terminal. Der Fehler wurde erfolgreich umgeleitet. Sie können den Inhalt von error.log anzeigen, um die erfasste Meldung zu sehen.

cat error.log

Die Ausgabe ist die Fehlermeldung des ls-Befehls:

ls: cannot access 'non_existent_file': No such file or directory

So wie >> die Standardausgabe anhängt, können Sie 2>> verwenden, um den Standardfehler an eine Datei anzuhängen. Versuchen wir, eine weitere nicht existierende Datei aufzulisten und den Fehler an unsere error.log anzuhängen.

ls another_fake_file 2>> error.log

Überprüfen Sie nun erneut den Inhalt von error.log.

cat error.log

Sie werden sehen, dass die neue Fehlermeldung am Ende der Datei hinzugefügt wurde.

ls: cannot access 'non_existent_file': No such file or directory
ls: cannot access 'another_fake_file': No such file or directory

Diese Technik ist sehr nützlich, um normale Ausgaben von Fehlermeldungen zu trennen, sodass Sie Fehler zur späteren Überprüfung protokollieren können, ohne Ihre Hauptausgabedateien zu überladen.

Beides, stdout und stderr, in eine einzige Datei umleiten

In diesem Schritt lernen Sie, wie Sie die gesamte Ausgabe eines Befehls – sowohl Standardausgabe als auch 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 werden zwei Arten von Ausgaben auf Ihrem Terminal sehen. Die erste Zeile ist der Standardfehler, und die zweite ist 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, wird die Fehlermeldung weiterhin auf dem Bildschirm angezeigt.

ls -l /etc/passwd non_existent_file > output_only.txt

Ausgabe auf dem Terminal:

ls: cannot access 'non_existent_file': No such file or directory

Und output_only.txt enthält nur die Standardausgabe:

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 Kurzform, die sowohl stdout (Dateideskriptor 1) als auch stderr (Dateideskriptor 2) an die angegebene Datei sendet.

Versuchen wir es. Wir leiten die gesamte Ausgabe in eine Datei namens combined.log um.

ls -l /etc/passwd non_existent_file &> combined.log

Diesmal wird nichts auf dem Terminal ausgegeben. Die gesamte Ausgabe wurde in combined.log erfasst. Sehen wir uns den Inhalt an:

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 auf dem Terminal. Die Überprüfung des Dateiinhaltes 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 und oft bevorzugt wird, werden Sie 2>&1 häufig in älteren Skripten sehen, daher ist es wichtig zu verstehen, was es tut. Um beide Streams anzuhängen, können Sie &>> oder >> file 2>&1 verwenden.

Ausgabe mit tee aufteilen und Standardeingabe mit < umleiten

In diesem letzten Schritt werden Sie zwei ergänzende Umleitungskonzepte untersuchen: das Aufteilen der Ausgabe mit dem Befehl tee und die Bereitstellung von Eingaben für einen Befehl aus einer Datei mithilfe des Operators <.

Ausgabe mit tee aufteilen

Manchmal möchten Sie die Ausgabe eines Befehls in einer Datei speichern und sie gleichzeitig auf dem Terminal anzeigen. Die Operatoren > und >> leiten die Ausgabe ausschließlich in eine Datei um und verbergen sie vor dem Bildschirm. Der Befehl tee löst dieses Problem, indem er die Ausgabe aufteilt und sowohl an eine Datei als auch an die Standardausgabe (Ihren Bildschirm) sendet. Er ist nach einem T-Stück in der Sanitärtechnik benannt, das einen Fluss in zwei Wege aufteilt.

Sehen wir uns das in Aktion an. Wir listen den Inhalt des Verzeichnisses /etc/ auf und verwenden tee, um die Liste sowohl auf dem Bildschirm anzuzeigen als auch in einer Datei namens etc_listing.txt zu speichern.

ls /etc/ | tee etc_listing.txt

Sie sehen die vollständige Verzeichnisliste, die auf Ihrem Terminal ausgegeben wird. Gleichzeitig hat der Befehl tee die exakt gleiche Ausgabe in etc_listing.txt geschrieben. Sie können dies überprüfen:

cat etc_listing.txt

Der Inhalt der Datei entspricht dem, was Sie auf dem Bildschirm gesehen haben.

Standardmäßig überschreibt tee die Zieldatei. Um stattdessen an eine Datei anzuhängen, verwenden Sie die Option -a. Dies ist sehr nützlich für die Protokollierung. Erstellen wir eine Protokolldatei und hängen zwei Einträge an.

date | tee system_log.txt
echo "User labex performed a system check." | tee -a system_log.txt

Der erste Befehl erstellt system_log.txt mit dem aktuellen Datum. Der zweite Befehl verwendet tee -a, um eine neue Zeile anzuhängen, ohne das Datum zu löschen. Sehen wir uns die endgültige Datei an:

cat system_log.txt

Die Ausgabe zeigt beide Zeilen:

Wed Jun 25 14:56:53 CST 2025
User labex performed a system check.

Standardeingabe mit < umleiten

Nun betrachten wir das Gegenteil der Ausgabeumleitung: die Umleitung der Standardeingabe (stdin). Viele Befehle wie sort, wc oder cat können Daten von stdin (normalerweise Ihrer Tastatur) lesen. Der Operator < ermöglicht es Ihnen, einem Befehl mitzuteilen, dass er seine Eingaben stattdessen aus einer Datei beziehen soll.

Erstellen wir zunächst eine einfache Datei mit einer Liste von Elementen. Wir nennen sie items.txt.

echo "banana" > items.txt
echo "apple" >> items.txt
echo "cherry" >> items.txt

Nun haben wir eine Datei items.txt mit drei unsortierten Elementen. Der Befehl sort kann Textzeilen sortieren. Verwenden wir <, um items.txt in den Befehl sort einzuspeisen.

sort < items.txt

Der Befehl liest den Inhalt von items.txt als seine Eingabe, sortiert ihn und gibt das Ergebnis an seine Standardausgabe (das Terminal) aus:

apple
banana
cherry

Dies ist funktional ähnlich wie die Ausführung von sort items.txt, demonstriert aber das mächtige Konzept der Umleitung einer Datei in die Standardeingabe eines Befehls. Dies wird unerlässlich, wenn Sie mit Befehlen arbeiten, die nur von stdin lesen können und keinen Dateinamen als Argument akzeptieren.

Als letztes Beispiel betrachten wir cat < items.txt. Dies weist cat an, seine Eingabe aus items.txt zu lesen, und da die Aufgabe von cat darin besteht, seine Eingabe an seine Ausgabe zu senden, zeigt es den Inhalt der Datei auf dem Bildschirm an.

cat < items.txt

Damit ist unsere Tour durch die grundlegende I/O-Umleitung in Linux abgeschlossen. Sie verfügen nun über die Werkzeuge, um zu steuern, woher Ihre Befehle ihre Eingaben erhalten und wohin ihre Ausgaben gehen.

Zusammenfassung

In diesem Lab haben Sie die Grundlagen der Umleitung von Befehlsausgaben in Linux kennengelernt. Sie haben zunächst den Operator > verwendet, um die Standardausgabe (stdout) eines Befehls in eine Datei zu senden, und festgestellt, dass dieser Operator die Zieldatei überschreibt, wenn sie bereits existiert. Um ein Überschreiben zu vermeiden, haben Sie den Operator >> verwendet, um die Ausgabe an das Ende einer Datei anzuhängen. Sie haben auch geübt, die Standardfehlerausgabe (stderr) mit dem Operator 2> in eine Datei umzuleiten, was nützlich ist, um Fehlermeldungen getrennt von der Standardausgabe zu erfassen.

Darüber hinaus hat das Lab gezeigt, wie diese Konzepte kombiniert werden können, indem sowohl stdout als auch stderr für eine umfassende Protokollierung in eine einzige Datei umgeleitet werden. Sie haben den Befehl tee als Methode zur Aufteilung der Ausgabe untersucht, wodurch diese in einer Datei gespeichert und gleichzeitig auf dem Terminal angezeigt werden kann. Schließlich haben Sie gelernt, die Standardeingabe (stdin) mit dem Operator < umzuleiten, wodurch ein Befehl seine Eingaben aus einer Datei anstelle der Tastatur lesen kann.