Datenstromumleitung

LinuxLinuxBeginner
Jetzt üben

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

Einleitung

In Linux ist die Umleitung (Redirection) ein mächtiges Feature, das es Ihnen ermöglicht, zu steuern, wohin die Ein- und Ausgaben von Befehlen geleitet werden. Möglicherweise haben Sie in früheren Labs Operatoren wie > oder >> gesehen. Diese werden verwendet, um die Ausgabe in Dateien umzuleiten. Dieses Lab führt Sie in das Konzept der Umleitung ein und leitet Sie durch verschiedene praktische Beispiele, die für Anfänger ohne Vorkenntnisse in Linux geeignet sind.

Dies ist ein geführter Lab (Guided Lab), der Schritt-für-Schritt-Anleitungen bietet, um Ihnen beim Lernen und Üben zu helfen. Befolgen Sie die Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Lab für Anfänger (beginner) ist mit einer Abschlussrate von 97%. Es hat eine positive Bewertungsrate von 98% von den Lernenden erhalten.

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 tut 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 weitere Inhalte zur selben Datei hinzu:

    echo 'labex.io' >> redirect

    Der Operator >> ist ähnlich wie >, aber anstatt die Datei zu überschreiben, hängt er den neuen Inhalt am Ende der vorhandenen Datei an.

  4. Um den Inhalt der gerade erstellten und geänderten Datei anzuzeigen, verwenden Sie den Befehl cat:

    cat redirect

    Sie sollten beide Zeilen sehen, die wir zur Datei hinzugefügt haben: "hello labex" in der ersten Zeile und "labex.io" in der zweiten Zeile.

Verständnis von Standardeingabe, Standardausgabe und Standardfehlerausgabe

Bevor wir uns tiefer mit der Umleitung befassen, lassen Sie uns drei wichtige Konzepte verstehen:

  1. Standardeingabe (stdin): Dies ist die Standardquelle für Eingaben, normalerweise Ihre Tastatur. Hier erwartet das System, dass Eingaben herkommen.
  2. Standardausgabe (stdout): Dies ist das Standardziel für Ausgaben, normalerweise Ihr Bildschirm. Hier sendet das System normale Ausgaben.
  3. Standardfehlerausgabe (stderr): Hier werden Fehlermeldungen gesendet, ebenfalls normalerweise Ihr Bildschirm. Sie ist von stdout getrennt, um Fehlermeldungen bei Bedarf anders behandeln zu können.

In Linux werden diese durch Dateideskriptoren (file descriptors) repräsentiert, welche einfach Zahlen sind, die geöffnete 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 – es bedeutet, dass Sie das vorhandene verwenden können.

  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 tut mehrere Dinge:

    • cat > startet den Prozess des Schreibens in eine Datei
    • Documents/test.c ist die Datei, in die wir schreiben
    • << EOF weist die Shell an, die Eingabe fortlaufend 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.

Umleitung der Standardfehlerausgabe

Nun wollen wir untersuchen, wie die Standardfehlerausgabe umgeleitet wird:

  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 die Standardfehlerausgabe in eine andere Datei um:

    cat Documents/test.c nonexistent.c > output.log 2> error.log

    Dieser Befehl tut mehrere Dinge:

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

Kombinieren von Standardausgabe und Standardfehlerausgabe

Manchmal möchten Sie sowohl die Standardausgabe als auch die Standardfehlerausgabe in dieselbe Datei umleiten. Dies ist besonders nützlich, wenn Sie die gesamte Ausgabe eines Befehls erfassen möchten, sei es normale Ausgabe oder Fehlermeldungen.

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

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

    Dieser Befehl tut mehrere Dinge:

    • ls -l . listet den Inhalt des aktuellen Verzeichnisses auf
    • nonexistent_directory ist der Versuch, ein nicht existierendes Verzeichnis aufzulisten
    • > 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 Verzeichnisauflistung 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 &> ist äquivalent zu > 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 Verwendungen von /dev/null

Das /dev/null-Gerät, oft als "Bit-Eimer" oder "Schwarzes Loch" bezeichnet, ist eine spezielle Datei, die alle Daten verwirft, die darauf geschrieben werden. Es hat mehrere nützliche Anwendungen in Shell-Skripten und Kommandozeilenoperationen.

  1. Unterdrücken der Befehlsausgabe:
    Wir haben bereits gesehen, wie die Standardausgabe unterdrückt wird:

    ls -l > /dev/null

    Und wie sowohl die Standardausgabe als auch die Standardfehlerausgabe unterdrückt werden:

    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 Verzeichnisauflistung sehen, aber nicht den Fehler bezüglich des nicht existierenden Verzeichnisses.

  3. Verwenden von /dev/null als leere Datei:
    /dev/null kann als Eingabe für eine leere Datei verwendet werden. Dies ist nützlich für Befehle, die eine Eingabedatei benötigen, 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. Überprüfen der Dateiexistenz:
    Sie können /dev/null verwenden, um zu überprüfen, ob eine Datei existiert, ohne eine Ausgabe zu erzeugen:

    if cp Documents/test.c /dev/null 2> /dev/null; then
      echo "File exists and is readable"
    else
      echo "File does not exist or is not readable"
    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. Leeren des Inhalts einer Datei:
    Sie können /dev/null verwenden, um den Inhalt einer Datei schnell zu leeren:

    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 etwas über die Umleitung von Datenströmen in Linux gelernt. Sie haben geübt:

  1. Grundlegende Ausgabeumleitung mit > und >>.
  2. Verständnis von Standardeingabe, -ausgabe und -fehlerausgabe.
  3. Umleitung der Standardfehlerausgabe mit 2>.
  4. Verwerfen von Ausgaben durch Umleitung nach /dev/null.

Diese Umleitungstechniken sind leistungsstarke Werkzeuge in Linux, mit denen Sie steuern können, wohin die Ausgabe Ihrer Befehle geleitet wird. Sie sind unerlässlich für das Skripting, die Protokollierung und die effektive Verwaltung der Befehlsausgabe. Wenn Sie weiterhin mit Linux arbeiten, werden Sie viele Situationen finden, in denen diese Techniken nützlich sind.