(Presque) tout est un fichier mais tout n'est pas un fichier normal . Cela n'a pas de sens d'appeler un éditeur de texte sur quelque chose qui est un fichier spécial tel qu'un répertoire, une prise réseau, un port série, etc.
Le fichier /dev/stdoutpeut être une ou plusieurs choses selon la variante unix:
- un fichier «spécial», généralement un périphérique de caractères;
- un lien symbolique «magique» qui pointe vers le fichier que le processus y accédant a ouvert sur ce descripteur;
- un lien symbolique vers l'un des éléments ci-dessus.
Dans tous les cas, l'ouverture de /dev/stdoutfichiers similaires crée un nouveau descripteur de fichier associé au même fichier que l'application a déjà ouvert sur le descripteur de fichier 1. «Sortie standard» signifie le descripteur de fichier 1, et c'est seulement une convention que ce descripteur de fichier est utilisé pour la sortie - le noyau s'en fiche.
Lorsque vous exécutez un programme dans un terminal, les trois descripteurs standard (0 = entrée standard, 1 = sortie standard, 2 = erreur standard) sont ouverts sur le terminal. La lecture à partir de ce périphérique renvoie des caractères saisis par l'utilisateur et l'écriture sur ce périphérique affiche du texte dans la fenêtre du terminal. (Il n'existe aucun moyen standard, étant donné un périphérique terminal, de lire la sortie qu'il affiche ou d'y injecter une entrée.)
Lorsque vous exécutez cat /dev/stdout, cela fait exactement la même chose que cat /dev/stdinor cat /dev/stderr, car ces trois descripteurs de fichiers sont connectés au même fichier: il indique catde lire à partir du terminal. C'est ce catque fait sans argument aussi.
Si vous couriez cat /dev/stdout >foo, alors vous vous /dev/stdoutréférez au fichier foo- cette commande est équivalente à cat foo >foo. En fonction de l' catimplémentation, il peut soit sortir une erreur (la version GNU se plaint que «le fichier d'entrée est un fichier de sortie»), soit ne rien faire car il lit le fichier foovide ( >foojuste tronqué). Avec une version catqui ne détecte pas ce cas spécial, si foon'est pas vide, alors cat /dev/stdout >>fooou l'équivalent cat foo >>fooajouterait le contenu du fichier à lui-même indéfiniment.
Lorsque vous exécutez vim /dev/stdout, il se plaint car il ne sait pas comment éditer un terminal (cela n'a tout simplement pas de sens).