Einführung
Unter Linux ist die Umleitung (Redirection) eine leistungsstarke Funktion, mit der Sie steuern können, wohin die Ein- und Ausgaben von Befehlen geleitet werden. Möglicherweise sind Ihnen in früheren Labs bereits Operatoren wie > oder >> begegnet. Diese werden verwendet, um Ausgaben in Dateien umzuleiten. Dieses Lab führt Sie in das Konzept der Umleitung ein und leitet Sie durch verschiedene praktische Beispiele, die auch für Anfänger ohne Vorkenntnisse in Linux geeignet sind.
Grundlegende Ausgabeumleitung
Beginnen wir mit den Grundlagen der Ausgabeumleitung:
Öffnen Sie Ihr Terminal. Sie sollten sich im Verzeichnis
/home/labex/projectbefinden. Wenn Sie sich nicht sicher sind, können Siepwd(print working directory) eingeben, um Ihren aktuellen Standort zu überprüfen.Wir erstellen eine neue Datei namens
redirectmit etwas Inhalt. Geben Sie den folgenden Befehl ein:echo 'hello labex' > redirectDieser Befehl bewirkt zwei Dinge:
echo 'hello labex'gibt den Text "hello labex" aus.- Das Symbol
>leitet diese Ausgabe in eine Datei namensredirectum.
Wenn die Datei nicht existiert, wird sie erstellt. Wenn sie bereits existiert, wird ihr Inhalt überschrieben.
Fügen wir nun der gleichen Datei weiteren Inhalt hinzu:
echo 'labex.io' >> redirectDer Operator
>>ähnelt>, aber anstatt die Datei zu überschreiben, wird der neue Inhalt an das Ende der bestehenden Datei angehängt.Um den Inhalt der Datei, die wir gerade erstellt und geändert haben, anzuzeigen, verwenden Sie den Befehl
cat:cat redirectSie sollten beide Zeilen sehen, die wir der Datei hinzugefügt haben: "hello labex" in der ersten Zeile und "labex.io" in der zweiten Zeile.
Standardeingabe, -ausgabe und -fehler verstehen
Bevor wir tiefer in die Umleitung eintauchen, lassen Sie uns drei wichtige Konzepte verstehen:
- Standardeingabe (stdin): Dies ist die Standard-Eingabequelle, normalerweise Ihre Tastatur. Hier erwartet das System, dass Eingaben herkommen.
- Standardausgabe (stdout): Dies ist das Standard-Ausgabeziel, normalerweise Ihr Bildschirm. Hierhin sendet das System normale Ausgaben.
- Standardfehler (stderr): Hierhin werden Fehlermeldungen gesendet, ebenfalls normalerweise Ihr Bildschirm. Dies ist von stdout getrennt, damit Fehlermeldungen bei Bedarf anders behandelt werden können.
Unter Linux werden diese durch Dateideskriptoren repräsentiert, bei denen es sich lediglich um Zahlen handelt, die offene Dateien darstellen:
| Dateideskriptor | Gerätedatei | Beschreibung |
|---|---|---|
0 |
/dev/stdin |
stdin |
1 |
/dev/stdout |
stdout |
2 |
/dev/stderr |
stderr |
Sehen wir uns ein Beispiel an, wie wir diese verwenden können:
Erstellen wir zunächst ein neues Verzeichnis namens
Documents:mkdir DocumentsDieser Befehl erstellt ein neues Verzeichnis. Wenn Sie eine Fehlermeldung erhalten, dass das Verzeichnis bereits existiert, ist das in Ordnung – das bedeutet, Sie können das bestehende verwenden.
Erstellen wir nun eine C-Datei in diesem Verzeichnis:
cat > Documents/test.c << EOF #include <stdio.h> int main() { printf("hello world\n"); return 0; } EOFDieser Befehl bewirkt Folgendes:
cat >startet den Prozess des Schreibens in eine Datei.Documents/test.cist die Datei, in die wir schreiben.<< EOFweist die Shell an, Eingaben so lange zu akzeptieren, bis sie "EOF" (End Of File) sieht.- Die Zeilen dazwischen sind der Inhalt, den wir in die Datei schreiben.
- Das abschließende
EOFmarkiert das Ende der Eingabe.
Sehen wir uns nun den Inhalt dieser Datei an:
cat Documents/test.cSie sollten den C-Code sehen, den wir gerade erstellt haben.
Standardfehler umleiten
Lassen Sie uns nun untersuchen, wie man den Standardfehler umleitet:
Versuchen Sie, zwei Dateien zu lesen, eine, die existiert, und eine, die nicht existiert:
cat Documents/test.c nonexistent.cSie sehen den Inhalt von
test.c(die existiert) und eine Fehlermeldung fürnonexistent.c(die nicht existiert). Der Inhalt vontest.cwird an stdout gesendet, während die Fehlermeldung an stderr gesendet wird.Leiten wir nun die Standardausgabe in eine Datei und den Standardfehler in eine andere Datei um:
cat Documents/test.c nonexistent.c > output.log 2> error.logDieser Befehl bewirkt Folgendes:
cat Documents/test.c nonexistent.cversucht, den Inhalt beider Dateien anzuzeigen.> output.logleitet stdout (Dateideskriptor 1) in eine Datei namensoutput.logum.2> error.logleitet stderr (Dateideskriptor 2) in eine Datei namenserror.logum.
Zeigen Sie den Inhalt beider Dateien an:
echo "Output log:" cat output.log echo "Error log:" cat error.logSie sollten den Inhalt von
test.cinoutput.logund die Fehlermeldung zunonexistent.cinerror.logsehen.
Standardausgabe und Standardfehler kombinieren
Manchmal möchten Sie sowohl die Standardausgabe als auch den Standardfehler in dieselbe Datei umleiten. Dies ist besonders nützlich, wenn Sie die gesamte Ausgabe eines Befehls erfassen möchten, egal ob es sich um normale Ausgaben oder Fehlermeldungen handelt.
Versuchen wir, den Inhalt unseres aktuellen Verzeichnisses und eines nicht existierenden Verzeichnisses mit einem Befehl aufzulisten:
ls -l . nonexistent_directory > combined_output.log 2>&1Dieser Befehl bewirkt Folgendes:
ls -l .listet den Inhalt des aktuellen Verzeichnisses auf.nonexistent_directoryist ein Versuch, ein Verzeichnis aufzulisten, das nicht existiert.> combined_output.logleitet stdout in eine Datei namenscombined_output.logum.2>&1leitet stderr an denselben Ort wie stdout um (in diesem Fallcombined_output.log).
Überprüfen wir nun den Inhalt unserer kombinierten Ausgabedatei:
cat combined_output.logSie sollten sowohl die Verzeichnisliste als auch die Fehlermeldung über das nicht existierende Verzeichnis in dieser Datei sehen.
Es gibt eine Kurzschreibweise, um sowohl stdout als auch stderr in bash in dieselbe Datei umzuleiten:
ls -l . nonexistent_directory &> another_combined_output.logDer Operator
&>entspricht> file 2>&1.Überprüfen Sie den Inhalt dieser neuen Datei:
cat another_combined_output.logSie sollten dieselbe Ausgabe wie in der vorherigen Datei sehen.
Fortgeschrittene Verwendung von /dev/null
Das Gerät /dev/null, oft als "Bit-Eimer" oder "Schwarzes Loch" bezeichnet, ist eine spezielle Datei, die alle Daten verwirft, die in sie geschrieben werden. Sie hat mehrere nützliche Anwendungen im Shell-Skripting und bei Befehlszeilenoperationen.
Unterdrücken von Befehlsausgaben: Wir haben bereits gesehen, wie man die Standardausgabe unterdrückt:
ls -l > /dev/nullUnd wie man sowohl die Standardausgabe als auch den Standardfehler unterdrückt:
ls -l nonexistent_directory > /dev/null 2>&1Nur Fehlermeldungen unterdrücken: Manchmal möchten Sie die Ausgabe sehen, aber nicht die Fehlermeldungen:
ls -l . nonexistent_directory 2> /dev/nullSie sollten die Verzeichnisliste sehen, aber nicht den Fehler über das nicht existierende Verzeichnis.
Verwendung von /dev/null als leere Datei:
/dev/nullkann als leere Dateieingabe verwendet werden. Dies ist nützlich für Befehle, die eine Eingabedatei erfordern, Sie aber keine tatsächliche Eingabe bereitstellen möchten. Zum Beispiel:grep "pattern" /dev/nullDieser Befehl erzeugt keine Ausgabe, da
/dev/nulleine leere Datei ist.Testen der Existenz einer Datei: Sie können
/dev/nullverwenden, um zu testen, ob eine Datei existiert, ohne eine Ausgabe zu erzeugen:if cp Documents/test.c /dev/null 2> /dev/null; then echo "Datei existiert und ist lesbar" else echo "Datei existiert nicht oder ist nicht lesbar" fiDieses Skript versucht,
test.cnach/dev/nullzu kopieren. Wenn dies erfolgreich ist, bedeutet dies, dass die Datei existiert und lesbar ist.Löschen des Inhalts einer Datei: Sie können
/dev/nullverwenden, um den Inhalt einer Datei schnell zu löschen:cat /dev/null > combined_output.logÜberprüfen Sie, ob die Datei jetzt leer ist:
cat combined_output.logSie sollten keine Ausgabe sehen, was darauf hinweist, dass die Datei jetzt leer ist.
Zusammenfassung
In diesem Lab haben Sie die Umleitung von Datenströmen unter Linux kennengelernt. Sie haben Folgendes geübt:
- Grundlegende Ausgabeumleitung mit
>und>>. - Verständnis von Standardeingabe, -ausgabe und -fehler.
- Umleitung des Standardfehlers mit
2>. - Verwerfen von Ausgaben durch Umleitung nach
/dev/null.
Diese Umleitungstechniken sind leistungsstarke Werkzeuge unter Linux, mit denen Sie steuern können, wohin die Ausgabe Ihrer Befehle geleitet wird. Sie sind unerlässlich für Skripting, Protokollierung und die effektive Verwaltung von Befehlsausgaben. Während Sie weiterhin mit Linux arbeiten, werden Sie viele Situationen finden, in denen diese Techniken nützlich sind.



