Umleitung von/zu geöffneten Dateien:

Weiterhin kann man anstatt eines Dateinamens auch (nach einem &-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