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

Hinweis: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.

Andere Erweiterungen