&
-Zeichen)
den Deskriptor einer
geöffneten Datei angeben (falls man ihn kennt natürlich).
Dies wird meistens dazu genutzt, die Standardfehlerausgabe mit der
Standardausgabe zusammenzulegen:
Kommando 2>&1
leitet die Fehlerausgabe (2) auf die Standardausgabe (1)
um.Dabei muß man allerdings beachten, daß eine weitere Umleitung der
Standardausgabe die Fehlerausgabe nicht ,,mitnimmt``. Will man also
beide Ausgaben in einer einzigen Datei wiederfinden, muß man das so
schreiben (die Umleitungen werden immer von links her ausgeführt!):
Kommando >
Dateiname 2>&1
Im umgekehrten Fall ( 2>&1
>
Dateiname) würde
erst die Fehlerausgabe zur Standardausgabe umgelenkt; letztere dann in
die Datei, aber ohne die Fehlerausgabe mitzunehmen.
Bei der bash gibt es zum Zusammenlegen der beiden Ausgaben
in eine Datei auch die Kurzform &>
Dateiname.
Analog kann man auch für ein Kommando in einer Pipeline erreichen, daß
seine Fehlerausgabe in die Pipeline einfließt:
Kommando1 2>&1 |
Kommando2
Dadurch werden sowohl Standardausgabe als auch die
Standardfehlerausgabe von Kommando1 an Kommando2 weitergereicht.
Wenn es nur die Fehlerausgabe sein soll, geht das natürlich auch:
Kommando1 2>&1 >/dev/null |
Kommando2
(die Reihenfolge ist wichtig!).
Die direkte Angabe der Dateideskriptoren kann man weiterhin nutzen, um
in einem eigenen Programm Dateien zu öffnen, und anschließend ein
weiteres Programm aufzurufen, wobei dessen Standarddateien auf die
eigenen geöffneten umgebogen werden können:
int eingabe = open( "eingabe.txt", O_RDONLY );
int ausgabe = creat "ausgabe.txt", 0600 );
// ... eingabe, ausgabe prüfen ...
char kommando[1024];
sprintf( kommando, "prg arg <&%d 2>%d", eingabe, ausgabe );
system( kommando );
Dabei wird in kommando eine Kommandozeile zusammengebaut; wenn
die Deskriptoren beispielsweise die Werte 12 und 14 haben, dann würde
die Kommandozeile den Inhalt prg arg <&12 2>%14
haben; also
liest das mit system() gestartete Programm aus der Datei
eingabe.txt und schreibt nach ausgabe.txt.
AnyWare@Wachtler.de