GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Erklärt:Eingabe-, Ausgabe- und Fehlerumleitung in Linux

Wenn Sie mit den grundlegenden Linux-Befehlen vertraut sind, sollten Sie auch das Konzept der Eingabe-Ausgabe-Umleitung lernen.

Sie wissen bereits, wie ein Linux-Befehl funktioniert. Es nimmt eine Eingabe und gibt Ihnen eine Ausgabe. Hier gibt es einige Player in der Szene. Lassen Sie mich Ihnen davon erzählen.

Stdin, stdout und stderr

Wenn Sie einen Linux-Befehl ausführen, spielen drei Datenströme eine Rolle:

  • Standardeingabe (stdin) ist die Quelle der Eingabedaten. Standardmäßig ist stdin jeder Text, der über die Tastatur eingegeben wird. Seine Stream-ID ist 0.
  • Standardausgabe (stdout) ist das Ergebnis des Befehls. Standardmäßig wird es auf dem Bildschirm angezeigt. Seine Stream-ID ist 1.
  • Standardfehler (stderr) ist die Fehlermeldung (falls vorhanden), die von den Befehlen erzeugt wird. Standardmäßig wird auch stderr auf dem Bildschirm angezeigt. Seine Stream-ID ist 2.

Diese Streams enthalten die Daten im Klartext im sogenannten Pufferspeicher.

Betrachten Sie es als einen Wasserstrom. Sie brauchen eine Quelle für Wasser, zum Beispiel einen Wasserhahn. Sie schließen ein Rohr daran an und können es entweder in einem Eimer aufbewahren (Datei) oder die Pflanzen gießen (drucken). Sie können es bei Bedarf auch an einen anderen Wasserhahn anschließen. Im Grunde leiten Sie das Wasser um.

Linux hat auch dieses Umleitungskonzept, bei dem Sie stdin, stdout und stderr von ihrem üblichen Ziel auf eine andere Datei oder einen anderen Befehl (oder sogar Peripheriegeräte wie Drucker) umleiten können.

Lassen Sie mich zeigen, wie die Umleitung funktioniert und wie Sie sie verwenden können.

Die Ausgabeumleitung

Die erste und einfachste Form der Umleitung ist die Ausgabeumleitung, auch stdout-Umleitung genannt.

Sie wissen bereits, dass die Ausgabe eines Befehls standardmäßig auf dem Bildschirm angezeigt wird. Zum Beispiel verwende ich den Befehl ls, um alle Dateien aufzulisten, und dies ist die Ausgabe, die ich bekomme:

[email protected]:~$ ls
appstxt  new.txt  static-ip.txt

Mit der Ausgabeumleitung können Sie die Ausgabe in eine Datei umleiten. Wenn diese Ausgabedatei nicht existiert, erstellt die Shell sie.

command > file

Lassen Sie mich zum Beispiel die Ausgabe des Befehls ls in einer Datei namens output.txt:

speichern
[email protected]:~$ ls > output.txt

Die Ausgabedatei wird vorher erstellt

Was sollte Ihrer Meinung nach der Inhalt dieser Ausgabedatei sein? Lassen Sie mich den cat-Befehl verwenden, um Ihnen eine Überraschung zu zeigen:

[email protected]:~$ cat output.txt 
appstxt
new.txt
output.txt
static-ip.txt

Haben Sie bemerkt, dass dort die output.txt enthalten ist ? Ich habe bewusst dieses Beispiel gewählt, um Ihnen dies zu zeigen.

Die Ausgabedatei, zu der die Standardausgabe umgeleitet wird, wird erstellt, bevor der beabsichtigte Befehl ausgeführt wird. Wieso den? Weil es das Ausgabeziel bereithalten muss, an das die Ausgabe gesendet wird.

Anhängen statt clobber

Ein oft ignoriertes Problem ist, dass die Shell die Datei zuerst löscht (clobber), wenn Sie auf eine bereits vorhandene Datei umleiten. Das bedeutet, dass der vorhandene Inhalt der Ausgabedatei entfernt und durch die Ausgabe des Befehls ersetzt wird.

Anstatt sie zu überschreiben, können Sie sie anhängen, indem Sie die>> Umleitungssyntax verwenden.

command >> file

Tipp :Du kannst Clobbering in der aktuellen Shell-Session verbieten mit:set -C

Warum würdest du stdout umleiten? Sie können die Ausgabe zum späteren Nachschlagen speichern und später analysieren. Es ist besonders hilfreich, wenn die Befehlsausgabe viel zu groß ist und den gesamten Bildschirm einnimmt. Es ist wie das Sammeln von Protokollen.

Pipe-Umleitung

Bevor Sie die stdin-Umleitung sehen, sollten Sie sich mit der Pipe-Umleitung vertraut machen. Dies ist häufiger und Sie werden es wahrscheinlich häufig verwenden.

Mit der Pipe-Umleitung senden Sie die Standardausgabe eines Befehls an die Standardeingabe eines anderen Befehls.

command 1 | command 2

Lassen Sie mich Ihnen ein praktisches Beispiel zeigen. Angenommen, Sie möchten die Anzahl der sichtbaren Dateien im aktuellen Verzeichnis zählen. Sie können ls -1 verwenden (es ist die Ziffer eins, nicht der Buchstabe L), um die Dateien im aktuellen Verzeichnis anzuzeigen:

[email protected]:~$ ls -1
appstxt
new.txt
output.txt
static-ip.txt

Sie wissen wahrscheinlich bereits, dass der Befehl wc zum Zählen der Zeilen in einer Datei verwendet wird. Wenn Sie diese beiden Befehle mit Pipe kombinieren, erhalten Sie Folgendes:

[email protected]:~$ ls -1 | wc -l
4

Bei Pipe teilen sich beide Befehle denselben Speicherpuffer. Die Ausgabe des ersten Befehls wird im Puffer gespeichert und derselbe Puffer wird dann als Eingabe für den nächsten Befehl verwendet.

Sie sehen das Ergebnis des letzten Befehls in der Pipeline. Das ist offensichtlich, weil die Standardausgabe früherer Befehle an die nächsten Befehle weitergegeben wird, anstatt auf den Bildschirm zu gehen.

Pipe Redirection oder Pipe ist nicht darauf beschränkt, nur zwei Befehle zu verbinden. Sie können mehrere Befehle verbinden, solange die Ausgabe eines Befehls als Eingabe des nächsten Befehls verwendet werden kann.

command_1 | command_2 | command_3 | command_4

Denken Sie daran, dass stdout/stdin ein Datenblock ist, keine Dateinamen

Einige neue Linux-Benutzer sind verwirrt, wenn sie die Umleitung verwenden. Wenn ein Befehl eine Reihe von Dateinamen als Ausgabe zurückgibt, können Sie diese Dateinamen nicht als Argument verwenden.

Wenn Sie zum Beispiel den Befehl find verwenden, um alle Dateien zu finden, die auf .txt enden, können Sie ihn nicht durch die Pipe leiten, um die gefundenen Dateien in ein neues Verzeichnis zu verschieben, nicht direkt so:

find . -type f -name "*.txt" | mv destination_directory

Aus diesem Grund sehen Sie häufig den Befehl find in Konjugation mit dem Befehl exec oder xargs. Diese speziellen Befehle wandeln den Text mit einer Reihe von Dateinamen in einen Dateinamen um, der als Argument übergeben werden kann.

find . -type f -name "*.txt" | xargs -t -I{} mv {} ../new_dir

Die Eingabeumleitung

Sie können die stdin-Umleitung verwenden, um den Inhalt einer Textdatei an einen Befehl wie diesen zu übergeben:

command < file

Sie werden nicht sehen, dass stdin viel verwendet wird. Das liegt daran, dass die meisten Linux-Befehle Dateinamen als Argument akzeptieren und daher die stdin-Umleitung oft nicht erforderlich ist.

Nehmen Sie zum Beispiel Folgendes:

head < filename.txt

Der obige Befehl hätte einfach head filename.txt sein können (ohne <).

Es ist nicht so, dass die stdin-Umleitung völlig nutzlos wäre. Einige Befehle verlassen sich darauf. Nehmen Sie zum Beispiel den Befehl tr. Dieser Befehl kann viel, aber im Beispiel unten wandelt er den Eingabetext von Klein- in Großbuchstaben um:

tr a-z A-Z < filename.txt

Tatsächlich ist die Verwendung von stdin über die Pipe besonders empfehlenswert, um die unnötige Verwendung des cat-Befehls zu vermeiden.

Zum Beispiel würden viele Leute das obige Beispiel mit cat verwenden und dann tr darauf verwenden. Ehrlich gesagt besteht hier keine Notwendigkeit, cat zu verwenden.

cat filename.txt | tr a-z A-Z

Weiterleitungen kombinieren

Sie können die stdin-, stdout- und Pipe-Umleitung je nach Bedarf kombinieren.

Der folgende Befehl listet beispielsweise alle .txt-Dateien im aktuellen Verzeichnis auf, zählt dann diese .txt-Dateien und speichert die Ausgabe in einer neuen Datei.

ls *.txt | wc -l > count.txt

Fehlerumleitung

Wenn Sie einen Befehl oder ein Skript ausführen, sehen Sie manchmal, dass eine Fehlermeldung auf dem Bildschirm angezeigt wird.

[email protected]:~$ ls -l ffffff > output.txt
ls: cannot access 'ffffff': No such file or directory

Am Anfang dieses Artikels habe ich erwähnt, dass es drei Datenströme gibt und stderr einer der Ausgabedatenströme ist, der standardmäßig auf dem Bildschirm angezeigt wird.

Sie können auch stderr umleiten. Da es sich um einen Ausgabedatenstrom handelt, können Sie dasselbe> oder>> Umleitungssymbol verwenden, das Sie für die stdout-Umleitung verwendet haben.

Aber wie unterscheiden Sie zwischen stdout und stderr, wenn beide Ausgabedatenströme sind? Durch ihre Stream-ID (auch Dateideskriptor genannt).

Datenstrom Stream-ID
stdin 0
stdout 1
stderr 2
-t, –Liste
-u, –aktualisieren
-x, –extrahieren, –holen
-j, –bzip2
-z, –gzip, –gunzip, –ungzip

Wenn Sie das Ausgabeumleitungssymbol> verwenden, bedeutet dies standardmäßig 1>. Sie sagen also, dass hier der Datenstrom mit der ID 1 ausgegeben wird.

Wenn Sie die stderr umleiten müssen, verwenden Sie ihre ID wie 2> oder 2>>. Dies bedeutet, dass die Ausgabeumleitung für den Datenstrom stderr (ID 2) ist.

Stderr-Umleitungsbeispiele

Lassen Sie es mich Ihnen anhand einiger Beispiele zeigen. Angenommen, Sie möchten nur den Fehler speichern, können Sie Folgendes verwenden:

[email protected]:~$ ls fffff 2> error.txt
[email protected]:~$ cat error.txt 
ls: cannot access 'fffff': No such file or directory

Das war einfach. Machen wir es etwas komplizierter (und nützlicher):

[email protected]:~$ ls -l new.txt ffff > output.txt 2> error.txt 
[email protected]:~$ cat output.txt 
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt
[email protected]:~$ cat error.txt 
ls: cannot access 'ffff': No such file or directory

Im obigen Beispiel versucht der Befehl ls, zwei Dateien anzuzeigen. Für eine Datei wird es erfolgreich und für die andere wird ein Fehler angezeigt. Also habe ich hier die stdout auf die ouput.txt (mit>) und die stderr auf die error.txt (mit 2>) umgeleitet.

Sie können auch sowohl stdout als auch stderr in dieselbe Datei umleiten. Dafür gibt es Möglichkeiten.

Im folgenden Beispiel sende ich zuerst die stderr (mit 2>>) an die Combined.txt-Datei im Append-Modus. Und dann wird die Standardausgabe (mit>>) im Anfügemodus an dieselbe Datei gesendet.

[email protected]:~$ ls -l new.txt fff 2>> combined.txt >> combined.txt 
[email protected]:~$ cat combined.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

Eine andere Möglichkeit, und dies ist die bevorzugte, ist die Verwendung von etwas wie 2>&1. Was grob übersetzt werden kann mit „leite stderr auf die gleiche Adresse wie stdout um“.

Nehmen wir das vorherige Beispiel und verwenden dieses Mal 2>&1, um sowohl stdout als auch stderr in dieselbe Datei umzuleiten.

[email protected]:~$ ls -l new.txt fff > output.txt 2>&1
[email protected]:~$ cat output.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

Denken Sie daran, dass Sie 2>>&1 nicht verwenden können, wenn Sie daran denken, es im Anfügemodus zu verwenden. 2>&1 geht bereits in den Append-Modus.

Sie können auch zuerst 2> und dann 1>&2 verwenden, um stdout in dieselbe Datei wie stderr umzuleiten. Im Grunde ist es „>&“, das einen ausgehenden Datenstrom auf einen anderen umleitet.

Zusammenfassung

  • Es gibt drei Datenströme. Ein Eingang, stdin (0) und zwei Ausgangsdatenströme stdout (1) und stderr (2).
  • Die Tastatur ist das standardmäßige stdin-Gerät und der Bildschirm ist das standardmäßige Ausgabegerät.
  • Die Ausgabeumleitung wird mit> oder>> (für den Anhängemodus) verwendet.
  • Eingabeumleitung wird mit <.
  • verwendet
  • Der stderr kann mit 2> oder 2>> umgeleitet werden.
  • stderr und stdout können mit 2>&1 kombiniert werden.

Da Sie die Umleitung lernen, sollten Sie auch den tee-Befehl kennen. Mit diesem Befehl können Sie gleichzeitig auf der Standardausgabe anzeigen und in einer Datei speichern.

Ich hoffe, Ihnen hat diese ausführliche Anleitung zur Umleitung unter Linux gefallen. Wenn Sie immer noch Zweifel haben oder Vorschläge zur Verbesserung dieses Artikels haben, lassen Sie es mich bitte im Kommentarbereich wissen.


Linux
  1. Arbeiten mit Eingabeausgabe und Fehlerumleitung in Linux

  2. Linux-Befehle:jobs, bg und fg

  3. Eingabe-/Ausgabeumleitung in Linux/Unix

  4. ls-Befehl unter Linux:17 nützliche Beispiele erklärt

  5. Wie interpretiere und behebe ich einen Eingabe-/Ausgabefehler in Linux?

Quellbefehl unter Linux erklärt

Eingabe-Ausgabe-Umleitung unter Linux erklärt

Bildschirmbefehl unter Linux erklärt

Arping-Befehl unter Linux erklärt

Shell-Scripting Teil 4 – Eingabe, Ausgabe und Umleitung

Beispiele für Linux-Echo-Befehle