Eine Einführung in die Linux-Ein- und Ausgaberichtung

Einführung

Die in Linux integrierten Umleitungs­funktionen bieten Ihnen ein robustes Set an Werkzeugen, um viele Arbeitsabläufe zu optimieren. Die „Unix-Philosophie“ der Software­entwicklung bestand darin, Werkzeuge zu erstellen, die jeweils eine Sache gut machen, und diese Philosophie wurde auf moderne Befehlszeilen­werkzeuge übertragen, die einzeln leistungs­fähig sind und exponentiell noch leistungs­fähiger sind, wenn sie kombiniert werden. Egal, ob Sie komplexe Software schreiben oder nur an der Befehlszeile arbeiten, das Wissen darüber, wie Sie die verschiedenen Ein- und Ausgabe­ströme in Ihrer Umgebung manipulieren können, wird Ihre Produktivität erheblich steigern.

Voraussetzungen

Um diesem Leitfaden folgen zu können, benötigen Sie Zugang zu einem Linux-Server. Wenn Sie Informationen zum Verbinden mit Ihrem Server zum ersten Mal benötigen, können Sie unserer Anleitung zum Verbinden mit einem Linux-Server über SSH folgen.

Ströme

Ein- und Ausgabe in der Linux-Umgebung sind auf drei Ströme verteilt. Diese Ströme sind:

  • Standarder Eingang (stdin)

  • Standardausgang (stdout)

  • Standardfehler (stderr)

Die Streams sind ebenfalls durchnummeriert:

  • stdin (0)

  • stdout (1)

  • stderr (2)

Während Standardinteraktionen zwischen dem Benutzer und dem Terminal stammt der Standardeingang vom Tastatur des Benutzers. Standardausgabe und Standardfehler werden als Text auf dem Terminal des Benutzers angezeigt. Zusammen werden die drei Streams als die Standardstreams bezeichnet.

Standarder Eingang

Der Standardeingabestream trägt typischerweise Daten von einem Benutzer zu einem Programm. Programme, die eine Standardeingabe erwarten, erhalten normalerweise Eingaben von einem Gerät, wie z.B. einer Tastatur. Später in diesem Tutorial werden Sie Beispiele dafür sehen, wie die Ausgabe eines Programms als Standardeingabe für ein anderes verwendet wird.

Standardausgabe

Die Standardausgabe ist die Ausgabe, die von einem Programm generiert wird. Wenn der Standardausgabestrom nicht umgeleitet wird, gibt er den Text direkt auf das Terminal aus. Versuchen Sie, einen beliebigen Text auszugeben, indem Sie echo verwenden:

  1. echo Sent to the terminal
Output
Sent to the terminal

Wenn es ohne zusätzliche Optionen verwendet wird, gibt der Befehl echo jedes Argument aus, das ihm in der Befehlszeile übergeben wird.

Führen Sie echo ohne Argumente aus:

  1. echo

Es wird eine leere Zeile zurückgeben. Einige Programme tun nichts, wenn keine Argumente bereitgestellt werden.

Standardfehler

Der Standardfehler enthält Fehler, die von einem Programm erzeugt wurden, das auf irgendeine Weise fehlgeschlagen ist. Wie bei der Standardausgabe ist das Standardziel für diesen Stream die Anzeige auf dem Terminal.

Lassen Sie uns ein einfaches Beispiel für den Standardfehler mit dem Befehl ls sehen. ls listet den Inhalt eines Verzeichnisses auf.

Wenn ls ohne Argument ausgeführt wird, listet es den Inhalt des aktuellen Verzeichnisses auf. Wenn ls mit einem Verzeichnis als Argument ausgeführt wird, listet es den Inhalt des bereitgestellten Verzeichnisses auf.

  1. ls %

Da % kein vorhandenes Verzeichnis ist, wird der folgende Text an den Standardfehler gesendet:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

Umleitung von Streams

Linux enthält Umleitungsanweisungen für jeden Stream. Diese können verwendet werden, um die Standardausgabe oder den Standardfehler in eine Datei zu schreiben. Wenn Sie in eine Datei schreiben, die nicht existiert, wird vor dem Schreiben eine neue Datei mit diesem Namen erstellt.

Befehle mit einer einzelnen Klammer überschreiben den Inhalt des Ziels.

Überschreiben

  • > – Standardausgabe

  • < – Standardeingabe

  • 2> – Standardfehler

Befehle mit einer doppelten Klammer überschreiben nicht den Inhalt des Ziels.

Anhängen

  • >> – Standardausgabe

  • << – Standardeingabe

  • 2>> – Standardfehler

Rohre

Rohre werden verwendet, um einen Datenstrom von einem Programm zu einem anderen umzuleiten. Wenn die Standardausgabe eines Programms über ein Rohr an ein anderes Programm gesendet wird, wird die Ausgabe des ersten Programms als Eingabe für das zweite verwendet, anstatt auf dem Terminal ausgegeben zu werden. Es werden nur die Daten angezeigt, die vom zweiten Programm zurückgegeben werden.

Das Linux-Rohr wird durch einen senkrechten Strich dargestellt: |

Hier ist ein Beispiel für einen Befehl, der ein Rohr verwendet:

  1. ls | less

Dies nimmt die Ausgabe von ls, das den Inhalt Ihres aktuellen Verzeichnisses anzeigt, und leitet sie an das Programm less weiter. less zeigt die empfangenen Daten zeilenweise an.

ls zeigt normalerweise den Verzeichnisinhalt über mehrere Zeilen an. Wenn Sie es durch less laufen lassen, wird jeder Eintrag in eine neue Zeile gesetzt.

Auch wenn die Funktionalität des Rohrs auf den ersten Blick der von > und >> ähnelt, besteht der Unterschied darin, dass Rohre Daten von einem Befehl zu einem anderen umleiten, während > und >> ausschließlich zur Umleitung in Dateien verwendet werden.

Filter

Filter sind eine Klasse von Programmen, die häufig mit der Ausgabe eines anderen Programms verwendet werden. Viele von ihnen sind auch alleine nützlich, aber sie veranschaulichen besonders gut das Verhalten von Piping.

  • find – gibt Dateien zurück, deren Dateinamen dem an find übergebenen Argument entsprechen.

  • grep – gibt Text zurück, der dem an grep übergebenen Zeichenmuster entspricht.

  • tee – leitet die Standardeingabe sowohl an die Standardausgabe als auch an eine oder mehrere Dateien um.

  • tr – findet und ersetzt eine Zeichenfolge durch eine andere.

  • wc – zählt Zeichen, Zeilen und Wörter.

Beispiele

Jetzt, da Sie mit Umleitung, Piping und grundlegenden Filtern vertraut sind, schauen wir uns einige häufige Umleitungs-Muster und Beispiele an.

Das Muster Befehl > Datei leitet die Standardausgabe eines Befehls in eine Datei um.

  1. ls ~ > root_dir_contents.txt

Der obige Befehl gibt den Inhalt Ihres Home-Verzeichnisses (~) als Standardausgabe aus und schreibt die Ausgabe in eine Datei mit dem Namen root_dir_contents.txt. Es löscht alle vorherigen Inhalte in der Datei, da es sich um einen einfachen Befehl handelt.

Das Muster Befehl > /dev/null leitet die Standardausgabe ins Nirgendwo um. /dev/null ist eine spezielle Datei, die verwendet wird, um Daten zu verwerfen, die darauf umgeleitet werden. Es wird verwendet, um die Standardausgabe zu verwerfen, die nicht benötigt wird und die sonst die Funktionalität eines Befehls oder Skripts beeinträchtigen könnte. Jede Ausgabe, die an /dev/null gesendet wird, wird verworfen.

  1. ls > /dev/null

Dieser Befehl verwirft den Standardausgabestrom, der vom Befehl ls zurückgegeben wird, indem er ihn an /dev/null weiterleitet.

Das Muster Befehl 2> Datei leitet den Standardfehlerstrom eines Befehls in eine Datei um und überschreibt vorhandene Inhalte.

  1. mkdir '' 2> mkdir_log.txt

Dies leitet den Fehler, der durch den ungültigen Verzeichnisnamen '' verursacht wird, um und schreibt ihn in log.txt. Beachten Sie, dass der Fehler trotzdem an das Terminal gesendet und als Text angezeigt wird.

Das Muster Befehl >> Datei leitet die Standardausgabe eines Befehls in eine Datei um, ohne die vorhandenen Inhalte der Datei zu überschreiben.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

Dieses Paar von Befehlen leitet zunächst den vom Benutzer durch echo eingegebenen Text in eine neue Datei um. Dann fügt es den Text, der vom zweiten echo-Befehl empfangen wird, an die vorhandene Datei an, ohne ihre Inhalte zu überschreiben.

Das Muster command 2>> file leitet den Standardfehlerstrom eines Befehls in eine Datei um, ohne dabei den vorhandenen Inhalt der Datei zu überschreiben. Dieses Muster ist nützlich, um Fehlerprotokolle für ein Programm oder einen Dienst zu erstellen, da die Protokolldatei nicht jedes Mal, wenn sie beschrieben wird, ihren vorherigen Inhalt verliert.

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

Der obige Befehl leitet die Fehlermeldung, die durch ein ungültiges Find-Argument verursacht wird, in eine Datei mit dem Namen stderr_log.txt um. Anschließend hängt er die Fehlermeldung, die durch ein ungültiges WC-Argument verursacht wird, an dieselbe Datei an.

Das Muster command | command leitet die Standardausgabe des ersten Befehls an die Standardeingabe des zweiten Befehls um.

  1. find /var lib | grep deb

Dieser Befehl sucht in /var und seinen Unterordnern nach Dateinamen und -erweiterungen, die mit der Zeichenfolge deb übereinstimmen, und gibt die Dateipfade für die Dateien zurück, wobei der übereinstimmende Teil in jedem Pfad rot hervorgehoben wird.

Das Muster command | tee file (welches den Befehl tee enthält) leitet die Standardausgabe des Befehls in eine Datei um und überschreibt deren Inhalt. Dann wird die umgeleitete Ausgabe im Terminal angezeigt. Es wird eine neue Datei erstellt, wenn die Datei noch nicht vorhanden ist.

Im Kontext dieses Musters wird tee typischerweise verwendet, um die Ausgabe eines Programms anzuzeigen und gleichzeitig in einer Datei zu speichern.

  1. wc /etc/magic | tee magic_count.txt

Dies leitet die Zählungen für Zeichen, Zeilen und Wörter in der Datei /etc/magic (die vom Linux-Shell verwendet wird, um Dateitypen zu bestimmen) an das Befehl tee weiter, welches dann die Ausgabe von wc in zwei Richtungen teilt und sie an die Terminalanzeige und die Datei magic_count.txt sendet. Für den Befehl tee stellen Sie sich den Buchstaben T vor. Der untere Teil des Buchstabens ist die ursprünglichen Daten, und der obere Teil sind die Daten, die in zwei verschiedene Richtungen aufgeteilt werden (Standardausgabe und Terminal). Mehrere Pipes können verwendet werden, um die Ausgabe über mehrere Befehle und/oder Filter umzuleiten.

Fazit

Das Erlernen der Umleitungs-Fähigkeiten, die in die Linux-Befehlszeile integriert sind, ist eine entscheidende Fähigkeit. Jetzt, da Sie die Grundlagen der Umleitungen und Pipes gesehen haben, können Sie Ihre Reise in die Welt des Shell-Skriptings beginnen, das häufig die in diesem Handbuch hervorgehobenen Programme und Muster verwendet.

Die Suche nach spezifischen Befehlen oder nach etwas, das Sie in der Befehlszeile tun möchten (z. B. „Alle Dateien in einem Verzeichnis löschen, die mit einem Großbuchstaben beginnen“), kann auch hilfreich sein, wenn Sie eine bestimmte Aufgabe mit der Befehlszeile erledigen möchten.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection