(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/stdoutkann 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/stdoutund ä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/stdinoder cat /dev/stderr, da diese drei Dateideskriptoren mit derselben Datei verbunden sind: Sie werden angewiesen cat, vom Terminal zu lesen. Das ist es, was catohne Argument auch tut.
Wenn Sie ausgeführt haben cat /dev/stdout >foo, /dev/stdoutverweisen Sie auf die Datei foo- dieser Befehl entspricht cat foo >foo. Abhängig von der catImplementierung 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 fooleeren Datei liest ( >foonur abgeschnitten). Mit einer Version cat, die diesen Sonderfall nicht erkennt, wenn er foonicht leer ist, würde cat /dev/stdout >>foooder das Äquivalent cat foo >>fooden 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).