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).