Einführung
Die in Linux integrierten Umleitungsfunktionen bieten Ihnen ein robustes Set an Werkzeugen, um viele Arbeitsabläufe zu optimieren. Die „Unix-Philosophie“ der Softwareentwicklung bestand darin, Werkzeuge zu erstellen, die jeweils eine Sache gut machen, und diese Philosophie wurde auf moderne Befehlszeilenwerkzeuge übertragen, die einzeln leistungsfähig sind und exponentiell noch leistungsfä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 Ausgabeströ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:
OutputSent 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:
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.
Da % kein vorhandenes Verzeichnis ist, wird der folgende Text an den Standardfehler gesendet:
Outputls: 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:
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.
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.
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.
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.
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.
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.
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.
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