Comment (et pourquoi) utiliser stderr pour la lecture et l'écriture?

12

Selon cette réponse de schily , lesslit les commandes de navigation de stderr s'il ne peut pas s'ouvrir /dev/tty.

Cela semble déroutant, car je n'ai jamais rien vu écrire sur le flux stderr d'un autre programme, et je ne sais même pas comment j'y parviendrais.

Quel est le but de stderr d'être ouvert à la lecture et à l'écriture? Et si cela est utile, comment puis-je l'utiliser sur des systèmes modernes? (Existe-t-il une syntaxe obscure pour diriger quelque chose dans stderr au lieu de stdin, par exemple?)

Draconis
la source

Réponses:

7

J'ai été surpris au début. Cependant, après avoir lu les réponses et fait une petite enquête, cela semble simple. Voici donc ce que j'ai trouvé. (à la fin il n'y a pas eu de surprise.)

Avant la redirection, stdin, stdout et stderr sont, comme prévu, connectés au même périphérique.

#ctrl-alt-delor:~$
#↳ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdout -> /proc/self/fd/1

#ctrl-alt-delor:~$
#↳ ll /proc/self/fd/*
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/0 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/1 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/2 -> /dev/pts/12

Par conséquent, après la plupart des réorientations (c'est-à-dire si stderr) n'est pas redirigé. stderr est toujours connecté au terminal. Par conséquent, il peut être lu pour obtenir une entrée au clavier.

La seule chose qui arrête les fichiers utilisés dans le sens inattendu est la convention et les canaux sont unidirectionnels.

Un autre exemple, essayez:

cat | less

Cela se passe mal après une page, lors d'une lesstentative de lecture du terminal (ce n'est pas une surprise, tout comme la catlecture du terminal).

/dev/ttyest plus mystérieux, ce n'est pas un lien vers /proc/self.

#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty

Voir quelles sont les relations entre mon terminal de contrôle actuel et `/ dev / tty`? pour une explication. Merci à @StephenKitt pour le lien.

ctrl-alt-delor
la source
Concernant /dev/tty, voir cette question .
Stephen Kitt
6

Lorsque vous vous connectez, stdin, stdout et stderr sont connectés au terminal à partir duquel vous vous connectez. Pour être plus précis, le tty est typiquement ouvert et stdout et stderr sont le résultat de deux dup(2)opérations sur le premier descripteur de fichier. Cela permet de lire à partir de stderr afin d'obtenir une entrée du terminal.

Comme mentionné dans l'autre réponse, les programmes lisent depuis stderr afin d'obtenir une réponse interactive à une question.

Puisqu'un utilisateur ne peut pas savoir dans quelles circonstances un programme lit à partir de stderr, il s'agit d'une tentative inutile d'écrire intentionnellement des données dans stderr à partir d'un autre programme.

Notez que les programmes d'aujourd'hui essaient généralement d'ouvrir /dev/ttyet d'utiliser stderr uniquement si cela ne fonctionne pas.

Les programmes qui ne lisent que depuis stderr n'ont généralement jamais été modifiés depuis avant 1979 et ces programmes contiennent généralement des constructions comme:

int i 1;

ou

i =* 2;

qui ne sont pas acceptés par les compilateurs C modernes. Par conséquent, il est très peu probable que vous trouviez aujourd'hui un programme qui ne s'ouvre jamais /dev/ttymais qui lit plutôt les réponses interactives de stderr.

schily
la source
Donc, si je comprends bien, le shell se connecte stderrau tty lorsqu'il stdinest redirigé (via un tuyau ou d'autres moyens)? Ou se connecte-t-il toujours stderrau tty?
Draconis
1
Lorsque vous vous connectez, stderr est connecté à votre terminal de connexion.
schily
2
i =+ 1est parfaitement valide C, et est égal à i = (+1). Certes, le premier est un bon candidat pour le concours C sournois.
G. Sliepen
1
OK, il se peut que cela crée simplement un avertissement. J'ai changé le code en C depuis 1977.
schily
1
Il semble que je suis au courant de plusieurs coques, car je ne sais d'au moins une coquille qui lit autre que son entrée standard . (-:
JdeBP