Shell-Ein-/Ausgabeumleitung
Die meisten UNIX-Systembefehle akzeptieren Eingaben von Ihrem Terminal und senden die resultierende Ausgabe an Ihr Terminal zurück. Ein Befehl liest Eingaben normalerweise von einem Ort namens Standardeingabe, die standardmäßig Ihr Terminal ist. Ähnlich schreibt ein Befehl seine Ausgabe normalerweise in die Standardausgabe, die standardmäßig ebenfalls Ihr Terminal ist.
Die Liste der Umleitungsbefehle lautet wie folgt:
| Befehl | Beschreibung |
|---|---|
| command > file | Ausgabe in Datei umleiten. |
| command < file | Eingabe aus Datei umleiten. |
| command >> file | Ausgabe im Anhängemodus in eine Datei umleiten. |
| n > file | Dateideskriptor n in eine Datei umleiten. |
| n >> file | Dateideskriptor n im Anhängemodus in eine Datei umleiten. |
| n >& m | Ausgabedateien m und n zusammenführen. |
| n <& m | Eingabedateien m und n zusammenführen. |
| << tag | Verwenden Sie den Inhalt zwischen dem Startmarker tag und dem Endmarker tag als Eingabe. |
Es ist zu beachten, dass Dateideskriptor 0 normalerweise die Standardeingabe (STDIN) ist, 1 die Standardausgabe (STDOUT) und 2 die Standardfehlerausgabe (STDERR).
Ausgabeumleitung
Die Umleitung wird im Allgemeinen durch das Einfügen bestimmter Symbole zwischen Befehlen realisiert. Insbesondere ist die Syntax dieser Symbole wie folgt:
command1 > file1
Der obige Befehl führt command1 aus und speichert anschließend den Inhalt der Ausgabe in file1.
Beachten Sie, dass jeglicher vorhandene Inhalt in file1 durch den neuen Inhalt ersetzt wird. Wenn Sie den neuen Inhalt an das Ende der Datei anhängen möchten, verwenden Sie den Operator >>.
Beispiele
Führen Sie den folgenden Befehl who aus, der die vollständige Ausgabe des Befehls in die Benutzerdatei (users) umleitet:
$ who > users
Nach der Ausführung wird keine Information auf dem Terminal ausgegeben, weil die Ausgabe vom standardmäßigen Standardausgabegerät (dem Terminal) in die angegebene Datei umgeleitet wurde.
Sie können den Befehl cat verwenden, um den Dateiinhalt anzuzeigen:
$ cat users _mbsetupuser console Oct 31 17:35 tianqixin console Oct 31 17:35 tianqixin ttys000 Dec 1 11:33
Die Ausgabeumleitung überschreibt den Dateiinhalt. Siehe das folgende Beispiel:
$ echo "Example:www.example.com" > users $ cat users Example:www.example.com $
Wenn Sie nicht möchten, dass der Dateiinhalt überschrieben wird, können Sie >> verwenden, um ihn an das Ende der Datei anzuhängen, zum Beispiel:
$ echo "Example:www.example.com" >> users $ cat users Example:www.example.com Example:www.example.com $
Eingabeumleitung
Genau wie bei der Ausgabeumleitung können Unix-Befehle auch Eingaben aus einer Datei beziehen, mit der Syntax:
command1 < file1
Auf diese Weise lesen Befehle, die ursprünglich Eingaben von der Tastatur benötigten, stattdessen Inhalte aus der Datei.
Hinweis: Die Ausgabeumleitung verwendet das Größer-als-Zeichen (>), und die Eingabeumleitung verwendet das Kleiner-als-Zeichen (<).
Beispiele
Um mit dem obigen Beispiel fortzufahren, müssen wir die Anzahl der Zeilen in der Datei users zählen. Führen Sie den folgenden Befehl aus:
$ wc -l users
2 users
Du kannst die Eingabe auch in die Datei users umleiten:
$ wc -l < users
2
Hinweis: Die Ergebnisse der beiden obigen Beispiele unterscheiden sich: Das erste Beispiel gibt den Dateinamen aus; das zweite nicht, weil es nur weiß, Inhalte von der Standardeingabe zu lesen.
command1 < infile > outfile
Um Eingabe und Ausgabe gleichzeitig zu ersetzen, führe command1 aus, lies den Inhalt aus der Datei infile und schreibe die Ausgabe anschließend nach outfile.
Ausführliche Erklärung der Umleitung
Im Allgemeinen öffnet jeder Unix/Linux-Befehl bei der Ausführung drei Dateien:
- Standardeingabedatei (stdin): Der Dateideskriptor von stdin ist 0, und Unix-Programme lesen standardmäßig Daten von stdin.
- Standardausgabedatei (stdout): Der Dateideskriptor von stdout ist 1, und Unix-Programme geben standardmäßig Daten an stdout aus.
- Standardfehlerdatei (stderr): Der Dateideskriptor von stderr ist 2, und Unix-Programme schreiben Fehlerinformationen in den stderr-Stream.
Standardmäßig leitet command > file stdout nach file um, und command < file leitet stdin nach file um.
Wenn stderr nach file umgeleitet werden soll, kannst du schreiben:
$ command 2>file
Wenn stderr an das Ende der Datei angehängt werden soll, kannst du schreiben:
$ command 2>>file
2Repräsentiert die Standardfehlerdatei (stderr).
Wenn Sie stdout und stderr zusammenführen und in eine Datei umleiten möchten, können Sie schreiben:
$ command > file 2>&1 或者 $ command >> file 2>&1
Wenn Sie sowohl stdin als auch stdout umleiten möchten, können Sie schreiben:
$ command < file1 >file2
Der Befehl command leitet stdin nach file1 und stdout nach file2 um.
Here-Dokument
Here-Dokument ist eine spezielle Umleitungsmethode in der Shell, mit der Eingaben an ein interaktives Shell-Skript oder Programm umgeleitet werden.
Seine grundlegende Form ist wie folgt:
command << delimiter
document
delimiter
Seine Funktion besteht darin, den Inhalt (das Dokument) zwischen zwei Trennzeichen als Eingabe an command zu übergeben.
Hinweis:
- Das abschließende Trennzeichen muss am Anfang der Zeile stehen, ohne Zeichen davor und ohne Zeichen danach, einschließlich Leerzeichen und Tabulator-Einrückung.
- Leerzeichen vor und nach dem beginnenden Trennzeichen werden ignoriert.
Beispiele
Verwenden Sie in der Befehlszeile denwc -lBefehl, um die Anzahl der Zeilen im Here-Dokument zu zählen:
$ wc -l << EOF
欢迎来到
Example
www.example.com
EOF
3 # 输出结果为 3 行
$
Wir können Here-Dokument auch in Skripten verwenden, zum Beispiel:
#!/bin/bash # author:Example # url:www.example.com cat << EOF 欢迎来到 Example www.example.com EOF
Führen Sie das obige Skript aus, Ausgabeergebnis:
欢迎来到 Example www.example.com
/dev/null-Datei
Wenn Sie einen Befehl ausführen möchten, aber die Ausgabe nicht auf dem Bildschirm anzeigen möchten, können Sie die Ausgabe nach /dev/null umleiten:
$ command > /dev/null
/dev/null ist eine spezielle Datei; alles, was hineingeschrieben wird, wird verworfen. Wenn Sie versuchen, Inhalte aus dieser Datei zu lesen, werden Sie nichts lesen. Die Datei /dev/null ist jedoch sehr nützlich. Das Umleiten der Ausgabe eines Befehls dorthin hat den Effekt, die Ausgabe zu unterdrücken.
Wenn Sie sowohl stdout als auch stderr unterdrücken möchten, können Sie schreiben:
$ command > /dev/null 2>&1
Andere ErweiterungenHinweis:0 ist Standardeingabe (STDIN), 1 ist Standardausgabe (STDOUT) und 2 ist Standardfehlerausgabe (STDERR).
Hier darf zwischen dem2und>kein Leerzeichen stehen,2>nur wenn sie kombiniert werden, stellt es Fehlerausgabe dar.