Unix / Linux - Shell-Eingabe- / Ausgabeumleitungen
In diesem Kapitel werden wir detailliert auf die Shell-Eingabe- / Ausgabeumleitungen eingehen. Die meisten Unix-Systembefehle nehmen Eingaben von Ihrem Terminal entgegen und senden die daraus resultierenden Ausgaben an Ihr Terminal zurück. Ein Befehl liest normalerweise seine Eingabe von der Standardeingabe, die standardmäßig Ihr Terminal ist. In ähnlicher Weise schreibt ein Befehl seine Ausgabe normalerweise in die Standardausgabe, die standardmäßig wieder Ihr Terminal ist.
Ausgabeumleitung
Die Ausgabe eines Befehls, der normalerweise für die Standardausgabe vorgesehen ist, kann stattdessen einfach in eine Datei umgeleitet werden. Diese Funktion wird als Ausgabeumleitung bezeichnet.
Wenn die Notationsdatei an einen Befehl angehängt wird, der normalerweise seine Ausgabe in die Standardausgabe schreibt, wird die Ausgabe dieses Befehls anstelle Ihres Terminals in eine Datei geschrieben.
Überprüfe das Folgende who Befehl, der die vollständige Ausgabe des Befehls in der Benutzerdatei umleitet.
$ who > users
Beachten Sie, dass am Terminal keine Ausgabe angezeigt wird. Dies liegt daran, dass die Ausgabe vom Standardausgabegerät (dem Terminal) in die angegebene Datei umgeleitet wurde. Sie können die Benutzerdatei auf den vollständigen Inhalt überprüfen -
$ cat users
oko tty01 Sep 12 07:30
ai tty15 Sep 12 13:32
ruth tty21 Sep 12 10:10
pat tty24 Sep 12 13:07
steve tty25 Sep 12 13:03
$
Wenn die Ausgabe eines Befehls in eine Datei umgeleitet wird und die Datei bereits einige Daten enthält, gehen diese Daten verloren. Betrachten Sie das folgende Beispiel -
$ echo line 1 > users
$ cat users
line 1
$
Mit dem Operator >> können Sie die Ausgabe in einer vorhandenen Datei wie folgt anhängen:
$ echo line 2 >> users
$ cat users
line 1
line 2
$
Eingabeumleitung
So wie die Ausgabe eines Befehls in eine Datei umgeleitet werden kann, kann auch die Eingabe eines Befehls aus einer Datei umgeleitet werden. Als diegreater-than character > wird für die Ausgabeumleitung verwendet, die less-than character < wird verwendet, um die Eingabe eines Befehls umzuleiten.
Bei den Befehlen, deren Eingabe normalerweise von der Standardeingabe übernommen wird, kann die Eingabe auf diese Weise aus einer Datei umgeleitet werden. Um zum Beispiel die Anzahl der Zeilen in der Datei zählen Benutzer erzeugt oben, können Sie den Befehl ausführen können wie folgt -
$ wc -l users
2 users
$
Bei der Ausführung erhalten Sie die folgende Ausgabe. Sie können die Anzahl der Zeilen in der Datei zählen, indem Sie die Standardeingabe von umleitenwcBefehl von den Datei- Benutzern -
$ wc -l < users
2
$
Beachten Sie, dass es einen Unterschied in der Ausgabe gibt, die von den beiden Formen des Befehls wc erzeugt wird. Im ersten Fall wird der Name der Dateibenutzer mit der Zeilenanzahl aufgelistet. im zweiten Fall ist es nicht.
Im ersten Fall weiß wc, dass es seine Eingaben von den Dateibenutzern liest. Im zweiten Fall weiß es nur, dass es seine Eingabe von der Standardeingabe liest, sodass der Dateiname nicht angezeigt wird.
Hier Dokument
EIN here document wird verwendet, um Eingaben in ein interaktives Shell-Skript oder -Programm umzuleiten.
Wir können ein interaktives Programm innerhalb eines Shell-Skripts ohne Benutzeraktion ausführen, indem wir die erforderlichen Eingaben für das interaktive Programm oder das interaktive Shell-Skript bereitstellen.
Die allgemeine Form für a here Dokument ist -
command << delimiter
document
delimiter
Hier interpretiert die Shell das <<Operator als Anweisung zum Lesen der Eingabe, bis eine Zeile mit dem angegebenen Trennzeichen gefunden wird. Alle Eingabezeilen bis zur Zeile mit dem Trennzeichen werden dann in die Standardeingabe des Befehls eingespeist.
Das Trennzeichen teilt der Shell mit, dass die hereDokument ist abgeschlossen. Ohne sie liest die Shell die Eingabe für immer weiter. Das Trennzeichen muss ein einzelnes Wort sein, das keine Leerzeichen oder Tabulatoren enthält.
Es folgt die Eingabe des Befehls wc -l um die Gesamtzahl der Zeilen zu zählen -
$wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
3
$
Du kannst den ... benutzen here document um mehrere Zeilen mit Ihrem Skript wie folgt zu drucken:
#!/bin/sh
cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
Bei der Ausführung erhalten Sie folgendes Ergebnis:
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
Das folgende Skript führt eine Sitzung mit dem aus vi Texteditor und speichert die Eingabe in der Datei test.txt.
#!/bin/sh
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands
Wenn Sie dieses Skript mit vim als vi ausführen, wird wahrscheinlich die folgende Ausgabe angezeigt:
$ sh test.sh
Vim: Warning: Input is not from a terminal
$
Nach dem Ausführen des Skripts sollte Folgendes zur Datei hinzugefügt werden test.txt - -
$ cat test.txt
This file was created automatically from
a shell script
$
Verwerfen Sie die Ausgabe
Manchmal müssen Sie einen Befehl ausführen, aber Sie möchten nicht, dass die Ausgabe auf dem Bildschirm angezeigt wird. In solchen Fällen können Sie die Ausgabe verwerfen, indem Sie sie in die Datei umleiten/dev/null - -
$ command > /dev/null
Hier ist der Befehl der Name des Befehls, den Sie ausführen möchten. Die Datei/dev/null ist eine spezielle Datei, die automatisch alle Eingaben verwirft.
Verwenden Sie die Standardumleitung, um sowohl die Ausgabe eines Befehls als auch seine Fehlerausgabe zu verwerfen STDERR zu STDOUT - -
$ command > /dev/null 2>&1
Hier 2 repräsentiert STDERR und 1 repräsentiert STDOUT. Sie können STDERR eine Nachricht anzeigen, indem Sie STDOUT wie folgt in STDERR umleiten:
$ echo message 1>&2
Umleitungsbefehle
Im Folgenden finden Sie eine vollständige Liste der Befehle, die Sie zur Umleitung verwenden können:
Sr.Nr. | Befehl & Beschreibung |
---|---|
1 | pgm > file Die Ausgabe von pgm wird in eine Datei umgeleitet |
2 | pgm < file Das Programm pgm liest seine Eingabe aus der Datei |
3 | pgm >> file Die Ausgabe von pgm wird an die Datei angehängt |
4 | n > file Ausgabe vom Stream mit Deskriptor n in Datei umgeleitet |
5 | n >> file Ausgabe vom Stream mit Deskriptor n an Datei angehängt |
6 | n >& m Führt die Ausgabe des Streams zusammen n mit Strom m |
7 | n <& m Führt Eingaben aus dem Stream zusammen n mit Strom m |
8 | << tag Die Standardeingabe erfolgt von hier bis zum nächsten Tag am Zeilenanfang |
9 | | Übernimmt die Ausgabe eines Programms oder Prozesses und sendet sie an ein anderes |
Beachten Sie, dass der Dateideskriptor 0 ist normalerweise Standardeingang (STDIN), 1 ist die Standardausgabe (STDOUT) und 2 ist die Standardfehlerausgabe (STDERR).