Datenstrom-Umleitung

LinuxBeginner
Jetzt üben

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:

  1. Öffnen Sie Ihr Terminal. Sie sollten sich im Verzeichnis /home/labex/project befinden. Wenn Sie sich nicht sicher sind, können Sie pwd (print working directory) eingeben, um Ihren aktuellen Standort zu überprüfen.

  2. Wir erstellen eine neue Datei namens redirect mit etwas Inhalt. Geben Sie den folgenden Befehl ein:

    echo 'hello labex' > redirect
    

    Dieser Befehl bewirkt zwei Dinge:

    • echo 'hello labex' gibt den Text "hello labex" aus.
    • Das Symbol > leitet diese Ausgabe in eine Datei namens redirect um.

    Wenn die Datei nicht existiert, wird sie erstellt. Wenn sie bereits existiert, wird ihr Inhalt überschrieben.

  3. Fügen wir nun der gleichen Datei weiteren Inhalt hinzu:

    echo 'labex.io' >> redirect
    

    Der Operator >> ähnelt >, aber anstatt die Datei zu überschreiben, wird der neue Inhalt an das Ende der bestehenden Datei angehängt.

  4. Um den Inhalt der Datei, die wir gerade erstellt und geändert haben, anzuzeigen, verwenden Sie den Befehl cat:

    cat redirect
    

    Sie 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:

  1. Standardeingabe (stdin): Dies ist die Standard-Eingabequelle, normalerweise Ihre Tastatur. Hier erwartet das System, dass Eingaben herkommen.
  2. Standardausgabe (stdout): Dies ist das Standard-Ausgabeziel, normalerweise Ihr Bildschirm. Hierhin sendet das System normale Ausgaben.
  3. 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:

  1. Erstellen wir zunächst ein neues Verzeichnis namens Documents:

    mkdir Documents
    

    Dieser 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.

  2. 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;
    }
    EOF
    

    Dieser Befehl bewirkt Folgendes:

    • cat > startet den Prozess des Schreibens in eine Datei.
    • Documents/test.c ist die Datei, in die wir schreiben.
    • << EOF weist 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 EOF markiert das Ende der Eingabe.
  3. Sehen wir uns nun den Inhalt dieser Datei an:

    cat Documents/test.c
    

    Sie sollten den C-Code sehen, den wir gerade erstellt haben.

Standardfehler umleiten

Lassen Sie uns nun untersuchen, wie man den Standardfehler umleitet:

  1. Versuchen Sie, zwei Dateien zu lesen, eine, die existiert, und eine, die nicht existiert:

    cat Documents/test.c nonexistent.c
    

    Sie sehen den Inhalt von test.c (die existiert) und eine Fehlermeldung für nonexistent.c (die nicht existiert). Der Inhalt von test.c wird an stdout gesendet, während die Fehlermeldung an stderr gesendet wird.

  2. 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.log
    

    Dieser Befehl bewirkt Folgendes:

    • cat Documents/test.c nonexistent.c versucht, den Inhalt beider Dateien anzuzeigen.
    • > output.log leitet stdout (Dateideskriptor 1) in eine Datei namens output.log um.
    • 2> error.log leitet stderr (Dateideskriptor 2) in eine Datei namens error.log um.
  3. Zeigen Sie den Inhalt beider Dateien an:

    echo "Output log:"
    cat output.log
    echo "Error log:"
    cat error.log
    

    Sie sollten den Inhalt von test.c in output.log und die Fehlermeldung zu nonexistent.c in error.log sehen.

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.

  1. Versuchen wir, den Inhalt unseres aktuellen Verzeichnisses und eines nicht existierenden Verzeichnisses mit einem Befehl aufzulisten:

    ls -l . nonexistent_directory > combined_output.log 2>&1
    

    Dieser Befehl bewirkt Folgendes:

    • ls -l . listet den Inhalt des aktuellen Verzeichnisses auf.
    • nonexistent_directory ist ein Versuch, ein Verzeichnis aufzulisten, das nicht existiert.
    • > combined_output.log leitet stdout in eine Datei namens combined_output.log um.
    • 2>&1 leitet stderr an denselben Ort wie stdout um (in diesem Fall combined_output.log).
  2. Überprüfen wir nun den Inhalt unserer kombinierten Ausgabedatei:

    cat combined_output.log
    

    Sie sollten sowohl die Verzeichnisliste als auch die Fehlermeldung über das nicht existierende Verzeichnis in dieser Datei sehen.

  3. Es gibt eine Kurzschreibweise, um sowohl stdout als auch stderr in bash in dieselbe Datei umzuleiten:

    ls -l . nonexistent_directory &> another_combined_output.log
    

    Der Operator &> entspricht > file 2>&1.

  4. Überprüfen Sie den Inhalt dieser neuen Datei:

    cat another_combined_output.log
    

    Sie 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.

  1. Unterdrücken von Befehlsausgaben: Wir haben bereits gesehen, wie man die Standardausgabe unterdrückt:

    ls -l > /dev/null
    

    Und wie man sowohl die Standardausgabe als auch den Standardfehler unterdrückt:

    ls -l nonexistent_directory > /dev/null 2>&1
    
  2. Nur Fehlermeldungen unterdrücken: Manchmal möchten Sie die Ausgabe sehen, aber nicht die Fehlermeldungen:

    ls -l . nonexistent_directory 2> /dev/null
    

    Sie sollten die Verzeichnisliste sehen, aber nicht den Fehler über das nicht existierende Verzeichnis.

  3. Verwendung von /dev/null als leere Datei: /dev/null kann 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/null
    

    Dieser Befehl erzeugt keine Ausgabe, da /dev/null eine leere Datei ist.

  4. Testen der Existenz einer Datei: Sie können /dev/null verwenden, 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"
    fi
    

    Dieses Skript versucht, test.c nach /dev/null zu kopieren. Wenn dies erfolgreich ist, bedeutet dies, dass die Datei existiert und lesbar ist.

  5. Löschen des Inhalts einer Datei: Sie können /dev/null verwenden, 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.log
    

    Sie 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:

  1. Grundlegende Ausgabeumleitung mit > und >>.
  2. Verständnis von Standardeingabe, -ausgabe und -fehler.
  3. Umleitung des Standardfehlers mit 2>.
  4. 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.