Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Eingabe und Ausgabe eines Kommandos umlenken

&pagelevel(4)&pagelevel

Vor der Ausführung eines Kommandos können Sie dessen Ein- und Ausgabe umlenken. Dazu benutzen Sie eine spezielle Notation, die von der POSIX-Shell interpretiert wird. Die folgenden Angaben können bei einem einfachen Kommando an beliebiger Stelle oder vor oder nach einem Kommando stehen. Diese Angaben werden nicht an das aufzurufende Kommando übergeben, sondern von der POSIX-Shell interpretiert. Parameter- und Kommando-Ersetzung werden durchgeführt, bevor datei oder dateikennzahl eingesetzt werden. Die Dateinamen-Erzeugung wird nur dann durchgeführt, wenn das Muster zu genau einem Dateinamen führt. Blankersetzung wird nicht durchgeführt.

<datei

lenkt die Standard-Eingabe (Dateikennzahl 0) des Kommandos auf datei um. Das Kommando liest seine Eingabe aus datei.

>datei

lenkt die Standard-Ausgabe (Dateikennzahl 1) des Kommandos auf datei um. Das Kommando schreibt seine Ausgabe in datei. Existiert die Datei noch nicht, wird sie neu angelegt. Existiert datei als einfache Datei bereits und ist die Option noclobber (siehe Kommandos, set -o) gesetzt, dann führt dies zu einem Fehler. Ist noclobber nicht gesetzt, dann wird der bisherige Inhalt der Datei gelöscht.

>|datei

Entspricht >datei, mit dem Unterschied, dass die Einstellung der Option noclobber ignoriert wird.

>>datei

lenkt die Standard-Ausgabe (Dateikennzahl 1) des Kommandos auf datei um. Das Kommando schreibt seine Ausgabe in datei. Wenn datei bereits existiert, wird die Ausgabe an den bisherigen Inhalt angehängt. Sonst wird die Datei neu angelegt.

<>datei

datei wird zum Lesen und Schreiben als Standard-Eingabe geöffnet.

<<[-]zeichenkette

leitet ein Here-Dokument ein. Ein Here-Dokument wird vor allem in Shell-Prozeduren eingesetzt, um Kommandos, die von der Standard-Eingabe lesen können, mit Werten zu versorgen.
An zeichenkette wird weder Parameter- und Kommando-Ersetzung noch Dateinamen-Erzeugung durchgeführt. Die Eingabe für die POSIX-Shell wird bis ausschließlich zu einer Zeile, die nur zeichenkette enthält, oder bis zum Dateiende gelesen.

Ist eines der Zeichen von zeichenkette entwertet, dann sind für die POSIX-Shell alle Zeichen des Here-Dokuments entwertet.


zeichenkette in der schließenden Zeile darf nicht entwertet sein.


Ist zeichenkette nicht entwertet, dann

  • wird Parameter- und Kommando-Ersetzung durchgeführt

  • wird die Zeichenfolge \Neue-Zeile-Zeichen ignoriert

  • müssen durch Gegenschrägstrich (\) der Gegenschrägstrich (\), das Dollarzeichen ($), das Gegenhochkomma (`) und der erste Buchstabe von zeichenkette entwertet werden, wenn Bedarf dafür im Text besteht.

Durch die Angabe von <<- werden alle führenden Tabulatorzeichen von den Zeilen des Here-Dokuments und vor zeichenkette gelöscht.

<&dateikennzahl
>&dateikennzahl

Bei der ersten Form wird die Standard-Eingabe durch Duplizieren von dateikennzahl umgelenkt.
Die Standard-Eingabe liest aus der Datei, die an die Dateikennzahl angeschlossen ist.
Die zweite Form gilt analog für die Standard-Ausgabe.

<&-
>&-

Durch die erste Form wird für das Kommando die Standard-Eingabe geschlossen.
Das Kommando erhält nur Datei-Ende als Eingabe.
Die zweite Form gilt für die Standard-Ausgabe, das Kommando gibt nichts aus.

<&p
>&p

Die Eingabe vom Koprozess bei einer bidirektionalen Pipe wird auf die Standard-Eingabe umgelenkt.
Analog wird die Ausgabe auf die Standard-Ausgabe umgelenkt.


Wird einer der obigen Anweisungen eine Nummer vorangestellt, dann wird die Dateikennzahl mit dieser Nummer (anstelle der 0 bzw. stdin und 1 bzw. stdout) umgeleitet.

Beispiel

Das folgende Beispiel öffnet Dateikennzahl 2 (stderr) zum Schreiben als ein Duplikat von Dateikennzahl 1 (stdout):

... 2>&1

Reihenfolge der Umlenkungen und Hintergrundkommandos

Die Reihenfolge der Umlenkungen ist signifikant. Die POSIX-Shell bewertet jede Umlenkung bezogen auf die Verbindung (Dateikennzahl, Datei) zum Zeitpunkt der Bewertung.
D.h.

... 1>datei 2>&1

verbindet zuerst die Standard-Ausgabe (Dateikennzahl 1) mit datei und verbindet dann die Standard-Fehlerausgabe (Dateikennzahl 2) mit der Datei, die mit Dateikennzahl 1 (also mit datei) verbunden ist. datei enthält nach der Ausführung die Standard-Ausgabe und die Fehlermeldungen des Kommandos.
Wäre die Reihenfolge umgekehrt, dann wäre Dateikennzahl 2 mit der Datensichtstation (falls Dateikennzahl 1 damit verbunden war) und Dateikennzahl 1 mit datei verbunden. Das heißt also: datei enthält dann nur noch die Standard-Ausgabe, aber nicht die Fehlermeldungen.

Wird ein Kommando mit & im Hintergrund gestartet, ohne aktive Auftragssteuerung, dann wird standardmäßig die Standard-Eingabe mit einer Datei verbunden, die die gleichen Eigenschaften wie /dev/null besitzt. Bei aktiver Auftragssteuerung enthält die Umgebung für die Ausführung des Kommandos die Dateikennzahlen der ausführenden POSIX-Shell, wie sie von den Anweisungen für Ein- und Ausgabe geändert wurden.

Sie können aus einem Skript Kommandos oder Pipes im Hintergrund starten. Diese können dann mit Ihrem Programm kommunizieren. Um einen solchen Koprozess zu starten, stellen Sie dem Kommando den Operator|& nach. Verwenden Sie bidirektionale Pipes nur in Skripts, jedoch nicht auf der Kommandozeile.

Kommandofolgen lassen sich nur einmal als bidirektionale Pipes aufrufen. Wenn Sie den ursprünglichen Prozess abgebrochen haben (z.B. mit kill -9 PID) und zu einem späteren Zeitpunkt nochmals versuchen, ein Kommando in eine bidirektionale Pipe zu schreiben, wird zwar eine Subshell aufgerufen, aber der Prozess gestoppt. Sie erhalten die Fehlermeldung:

sh: bad file unit number.