Linux-Tutorial / Standard-Eingabe, Ausgabe, Umleitung und Pipes
Ein Shell-Befehl hat normalerweise drei Kanäle: Standardeingabe (stdin), Standardausgabe (stdout) und Standardfehlerausgabe (stderr). In Bash liefert < Dateieingaben, > und >> speichern normale Ausgaben, und 2> speichert Fehler. Eine Pipe | verbindet die Ausgabe eines Befehls mit der Eingabe eines anderen Befehls. Das Nachverfolgen dieser Kanäle erklärt, warum einige Ergebnisse auf dem Bildschirm erscheinen und andere nicht.
Diese Lektion folgt der Standardeingabe, Ausgabe und Fehler zu Dateien oder Befehlen. Die Erfolgs- und Misserfolgsbedingungen für && und || werden in Ablauf der Shell-Ausführung erklärt.
Die drei Standarddatenströme erkennen
Die drei Standard-Dateideskriptoren, die einem Prozess zur Verfügung stehen, werden ebenfalls durch Zahlen identifiziert. Sie sind anfangs normalerweise an Ihr Terminal angeschlossen, aber Umleitungen und Pipes können ihre Ziele ändern.
| Nummer | Strom | Hauptrolle |
|---|---|---|
0 |
Standard-Eingabe (stdin) | Daten, die der Befehl liest |
1 |
Standard-Ausgabe (stdout) | Normale Ergebnisse |
2 |
Standardfehlerausgabe (stderr) | Diagnose und Fehler |
Die beiden Ausgabeströme können gleichzeitig in einem Terminal angezeigt werden, sind jedoch getrennt. Das Senden normaler Ausgabe in eine Datei mit > kann daher eine Fehlermeldung auf dem Bildschirm belassen. Die Zahlen erklären Syntaxen wie 2>.
Erstellen Sie eine Übungsdatei
Diese Beispiele gehen von Bash aus. Wenn ~/linux-course-14-practice existiert, wählen Sie einen anderen Namen. Fahren Sie nicht fort, wenn Sie kein neues Verzeichnis erstellen können: > schneidet eine vorhandene Datei ab und ersetzt sie.
mkdir ~/linux-course-14-practice cd ~/linux-course-14-practice pwd
Nachdem Sie Ihren Standort überprüft haben, speichern Sie zwei Zeilen und fügen eine dritte hinzu. >> fügt die Ausgabe am Ende hinzu, anstatt den früheren Inhalt zu ersetzen.
printf 'alpha\nbeta\n' > source.txt printf 'gamma\n' >> source.txt cat source.txt
Die endgültige Ausgabe ist alpha, beta und gamma in dieser Reihenfolge. Entscheiden Sie, ob Sie ersetzen oder anhängen möchten, bevor Sie den Operator auswählen.
Geben Sie Eingaben ein oder speichern Sie die normale Ausgabe
< verbindet eine Datei mit der Standard-Eingabe. wc -l < source.txt übergibt den Stream anstelle eines Dateinamens als Argument, sodass seine Ausgabe nur die Zahl 3 ist. Im Gegensatz dazu fügt wc -l source.txt normalerweise den Dateinamen nach der Zahl hinzu.
wc -l < source.txt
Verwenden Sie >, um die normale Ausgabe zu speichern. Nach dem nächsten Befehl wird die übereinstimmende Zeile stattdessen in matches.txt geschrieben, anstatt auf dem Terminal ausgegeben zu werden.
grep 'beta' source.txt > matches.txt cat matches.txt
cat matches.txt sollte beta ausdrucken. Ein Weiterleitungsziel wird geöffnet, bevor der eigentliche Befehl ausgeführt wird; ein Tippfehler bei einem wichtigen vorhandenen Dateinamen nach > kann dessen frühere Inhalte löschen.
Fehler getrennt behandeln
Wenn ls eine Datei nicht finden kann, schreibt es eine Diagnose in die Standardfehlerausgabe. Der folgende Befehl speichert nur diesen Stream in errors.txt. Es wird davon ausgegangen, dass absent-14.txt im neuen Übungsverzeichnis nicht existiert.
ls absent-14.txt 2> errors.txt cat errors.txt
Die Formulierung hängt vom Gebietsschema ab, aber die Meldung sollte besagen, dass die Datei fehlt. Um normale Ausgabe und Fehler in einer Datei zu kombinieren, kann Bash command > all.txt 2>&1 verwenden. Das 2>&1 macht die Standardfehlerausgabe zur aktuellen Zielposition der Standardausgabe.
ls absent-14.txt > all.txt 2>&1 cat all.txt
Umleitungen werden von links nach rechts verarbeitet. Eine Umkehrung der Reihenfolge zu 2>&1 > all.txt ist nicht gleichwertig: der Standardfehlerausgabe kann weiterhin mit dem Terminal verbunden bleiben, das zuvor das Ziel des Standardausgangs war.
Zwei Befehle mit einer Pipe verbinden
Eine Pipe | nimmt die Standardausgabe des linken Befehls und liefert sie als Standardeingabe des rechten Befehls. Dieses Beispiel findet Zeilen, die beta enthalten, und zählt sie:
grep 'beta' source.txt | wc -l
Die Übungsdatei liefert 1. Eine einfache Pipe sendet auch nicht den Standardfehlerausgabe des linken Befehls. Standardmäßig meldet Bash den Exit-Status des letzten Befehls einer Pipeline. Wenn also grep keine Übereinstimmung hat, aber wc -l erfolgreich 0 ausgibt, kann die Pipeline trotzdem Erfolg melden. Wenn Fehler in früheren Stufen relevant sind, sollten Sie eine separate Überprüfung oder Bashs pipefail-Einstellung in Betracht ziehen.
Umleitung ändert, wohin die Ströme eines Befehls gehen; eine Pipe verbindet zwei Befehle. Wenn das Ergebnis überraschend ist, führen Sie jede Stufe einzeln aus, um zu bestimmen, welcher Strom den Wert oder Fehler enthält.
Offizielle Dokumentation
Die GNU Bash Umleitungsdokumentation behandelt <, >, 2> und die Auswertungsreihenfolge. Die GNU Bash Pipeline-Dokumentation behandelt Pipes und deren Exit-Status.




