Ein- und Ausgabeumleitung in Linux

CompTIABeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie die grundlegenden Techniken zur Umleitung von Ein- und Ausgaben in der Linux-Shell kennen. Sie werden untersuchen, wie Sie den Datenfluss von Befehlen steuern können, indem Sie die drei Standard-Streams manipulieren: die Standardausgabe (stdout), den Standardfehler (stderr) und die Standardeingabe (stdin). Dieses Lab bietet praktische Übungen mit den wichtigsten Umleitungsoperatoren, die es Ihnen ermöglichen, Befehlsausgaben zu speichern, Fehlermeldungen zu verwalten und Befehlen Eingaben aus Dateien zuzuführen.

Im Laufe der Übungen werden Sie den >-Operator verwenden, um die Befehlsausgabe in eine Datei zu leiten und dabei vorhandene Inhalte zu überschreiben, sowie den >>-Operator, um Ausgaben anzuhängen, ohne Daten zu verlieren. Sie werden außerdem lernen, wie Sie gezielt Fehlermeldungen mit 2> umleiten und wie Sie sowohl die Standardausgabe als auch den Standardfehler in einer einzigen Datei zusammenführen. Schließlich werden Sie den tee-Befehl einsetzen, um Ausgaben gleichzeitig auf dem Bildschirm anzuzeigen und in einer Datei zu speichern, und die Umleitung der Standardeingabe mit dem <-Operator üben, damit ein Befehl Daten aus einer Datei statt über die 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.

Führen wir zunächst einen einfachen Befehl aus und betrachten die Ausgabe im Terminal.

echo "Hello from LabEx"

Sie sollten die folgende Ausgabe direkt in Ihrem Terminal sehen:

Hello from LabEx

Leiten wir diese Ausgabe nun 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 Sie dieses Mal keine Ausgabe im Terminal sehen. Das liegt daran, dass die Ausgabe an die Datei hello.txt gesendet wurde. Sie können den Inhalt der Datei mit dem cat-Befehl überprüfen:

cat hello.txt

Die Ausgabe zeigt den Text, der umgeleitet wurde:

Hello from LabEx

Der >-Operator erstellt die Datei, falls sie noch nicht existiert. Seien Sie vorsichtig: Wenn die Datei bereits existiert, wird der >-Operator ihren gesamten Inhalt ohne Vorwarnung überschreiben. Sehen wir uns das in der Praxis 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

Betrachten Sie nun den Inhalt von file_list.txt:

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 prüfen, werden Sie feststellen, dass die ursprüngliche Dateiliste ersetzt wurde.

cat file_list.txt

Die Ausgabe lautet nun:

This is new content.

Dies verdeutlicht 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 am Ende einer Datei hinzufügen, ohne deren bestehenden Inhalt zu löschen. Im vorherigen Schritt haben Sie gesehen, dass der >-Operator die Zieldatei überschreibt. Um dies zu vermeiden, können Sie den Append-Operator >> verwenden. Dieser Operator ist äußerst nützlich für Aufgaben wie das Führen einer fortlaufenden Protokolldatei, in der Sie im Laufe der Zeit neue Einträge hinzufügen möchten.

Beginnen wir damit, eine Datei mit einem ersten Inhalt zu erstellen. 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 eine neue Zeile mit dem >>-Operator an, anstatt die Datei zu überschreiben.

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

Prü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 eignet sich hervorragend zum Erstellen von Logdateien. Erstellen wir eine einfache Protokolldatei namens activity.log und fügen ihr mit dem date-Befehl einen Zeitstempel hinzu.

date > activity.log

Hängen wir nun einen weiteren Zeitstempel an dieselbe Datei an.

date >> activity.log

Betrachten Sie die fertige Datei activity.log, um beide Einträge zu sehen.

cat activity.log

Die Ausgabe zeigt zwei Zeitstempel, was beweist, dass der zweite Befehl seine Ausgabe angehängt hat, anstatt die Datei zu überschreiben. Die exakten Zeiten werden variieren.

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

Dies zeigt, wie >> bestehende Daten bewahrt 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 2>-Operator umleiten

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

Um stderr umzuleiten, müssen Sie dessen Dateideskriptor angeben, welcher die 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>.

Erzeugen wir einen Fehler, um dies in Aktion zu sehen. Wir versuchen, eine Datei aufzulisten, die nicht existiert.

ls non_existent_file

Dieser Befehl wird fehlschlagen und eine Fehlermeldung in Ihrem Terminal ausgeben:

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

Versuchen wir nun, dies mit dem standardmäßigen >-Operator umzuleiten.

ls non_existent_file > output.txt

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

cat output.txt

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

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

ls non_existent_file 2> error.log

Diesmal erscheint keine Meldung im Terminal. Der Fehler wurde erfolgreich umgeleitet. Sie können den Inhalt von error.log betrachten, 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

Genau 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

Prüfen Sie nun den Inhalt von error.log erneut.

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. So können Sie Fehler für eine spätere Überprüfung protokollieren, ohne Ihre Hauptausgabedateien unübersichtlich zu machen.

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.

tee zum Aufteilen der Ausgabe und < zur Umleitung der Standardeingabe verwenden

In diesem letzten Schritt werden Sie zwei ergänzende Umleitungskonzepte untersuchen: das Aufteilen der Ausgabe mit dem tee-Befehl und das Zuführen von Eingaben an einen Befehl aus einer Datei mit dem <-Operator.

Ausgabe mit tee aufteilen

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

Sehen wir es uns 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 in Ihrem Terminal. Gleichzeitig hat der tee-Befehl exakt dieselbe 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 Logdatei 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 und hängt eine neue Zeile an, ohne das Datum zu löschen. Prüfen wir die fertige Datei:

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

Betrachten wir nun das Gegenteil der Ausgabenumleitung: die Umleitung der Standardeingabe (stdin). Viele Befehle wie sort, wc oder cat können Daten von stdin lesen (normalerweise Ihre Tastatur). Mit dem <-Operator können Sie einem Befehl mitteilen, dass er seine Eingabe stattdessen aus einer Datei beziehen soll.

Zuerst erstellen wir 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

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

sort < items.txt

Der Befehl liest den Inhalt von items.txt als 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, eine Datei an die Standardeingabe eines Befehls umzuleiten. 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. Da die Aufgabe von cat darin besteht, seine Eingabe an seine Ausgabe weiterzugeben, wird der Inhalt der Datei auf dem Bildschirm angezeigt.

cat < items.txt

Damit endet unser Überblick über die grundlegende I/O-Umleitung in Linux. Sie verfügen nun über die Werkzeuge, um zu steuern, woher Ihre Befehle ihre Eingaben beziehen und wohin ihre Ausgaben gesendet werden.

Zusammenfassung

In diesem Lab haben Sie die Grundlagen der Umleitung von Befehlsausgaben in Linux gelernt. Sie haben damit begonnen, den >-Operator zu verwenden, um die Standardausgabe (stdout) eines Befehls in eine Datei zu senden, wobei Sie beachtet haben, dass dieser Operator die Zieldatei überschreibt, falls sie bereits existiert. Um ein Überschreiben zu vermeiden, haben Sie den >>-Operator verwendet, um Ausgaben am Ende einer Datei anzuhängen. Sie haben außerdem geübt, den Standardfehler (stderr) mit dem 2>-Operator in eine Datei umzuleiten, was nützlich ist, um Fehlermeldungen getrennt von der Standardausgabe zu erfassen.

Darüber hinaus hat das Lab gezeigt, wie man diese Konzepte kombiniert, indem man sowohl stdout als auch stderr für eine umfassende Protokollierung in eine einzige Datei umleitet. Sie haben den tee-Befehl als Methode zum Aufteilen der Ausgabe kennengelernt, wodurch diese in einer Datei gespeichert und gleichzeitig im Terminal angezeigt werden kann. Schließlich haben Sie gelernt, die Standardeingabe (stdin) mit dem <-Operator umzuleiten, sodass ein Befehl seine Eingabe aus einer Datei statt über die Tastatur lesen kann.