(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/stdout
peut ê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/stdout
fichiers 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/stdin
or cat /dev/stderr
, car ces trois descripteurs de fichiers sont connectés au même fichier: il indique cat
de lire à partir du terminal. C'est ce cat
que fait sans argument aussi.
Si vous couriez cat /dev/stdout >foo
, alors vous vous /dev/stdout
référez au fichier foo
- cette commande est équivalente à cat foo >foo
. En fonction de l' cat
implé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 foo
vide ( >foo
juste tronqué). Avec une version cat
qui ne détecte pas ce cas spécial, si foo
n'est pas vide, alors cat /dev/stdout >>foo
ou l'équivalent cat foo >>foo
ajouterait 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).