(Fast) alles ist eine Datei, aber nicht alles ist eine normale Datei. Es ist nicht sinnvoll, einen Texteditor für eine spezielle Datei aufzurufen, z. B. ein Verzeichnis, einen Netzwerk-Socket, eine serielle Schnittstelle usw.
Die Datei /dev/stdout
kann abhängig von der Unix-Variante eines von mehreren Dingen sein:
- eine "spezielle" Datei, typischerweise ein Zeichengerät;
- ein "magischer" symbolischer Link, der auf die Datei verweist, die der Prozess, der darauf zugreift, in diesem Deskriptor geöffnet hat;
- eine symbolische Verknüpfung zu einem der oben genannten.
In jedem Fall wird beim Öffnen /dev/stdout
und ähnlichen Dateien ein neuer Dateideskriptor erstellt, der derselben Datei zugeordnet ist, die die Anwendung bereits für Dateideskriptor 1 geöffnet hat. „Standardausgabe“ bedeutet Dateideskriptor 1, und es ist nur eine Konvention, dass dieser Dateideskriptor verwendet wird für die Ausgabe - der Kernel ist das egal.
Wenn Sie ein Programm in einem Terminal ausführen, werden alle drei Standarddeskriptoren (0 = Standardeingabe, 1 = Standardausgabe, 2 = Standardfehler) auf dem Endgerät geöffnet. Beim Lesen von diesem Gerät werden vom Benutzer eingegebene Zeichen zurückgegeben, und beim Schreiben auf dieses Gerät wird Text im Terminalfenster angezeigt. (Bei einem Endgerät gibt es keine Standardmethode, um die angezeigte Ausgabe zu lesen oder Eingaben in diese zu injizieren.)
Wenn Sie ausführen cat /dev/stdout
, geschieht genau das Gleiche wie cat /dev/stdin
oder cat /dev/stderr
, da diese drei Dateideskriptoren mit derselben Datei verbunden sind: Sie werden angewiesen cat
, vom Terminal zu lesen. Das ist es, was cat
ohne Argument auch tut.
Wenn Sie ausgeführt haben cat /dev/stdout >foo
, /dev/stdout
verweisen Sie auf die Datei foo
- dieser Befehl entspricht cat foo >foo
. Abhängig von der cat
Implementierung kann es entweder zu einem Fehler kommen (die GNU-Version beschwert sich darüber, dass „Eingabedatei Ausgabedatei ist“), oder es wird nichts unternommen, weil es aus der foo
leeren Datei liest ( >foo
nur abgeschnitten). Mit einer Version cat
, die diesen Sonderfall nicht erkennt, wenn er foo
nicht leer ist, würde cat /dev/stdout >>foo
oder das Äquivalent cat foo >>foo
den Inhalt der Datei auf unbestimmte Zeit an sich selbst anhängen.
Wenn Sie ausführen vim /dev/stdout
, beschwert es sich, weil es nicht weiß, wie ein Terminal bearbeitet werden soll (das macht einfach keinen Sinn).