Comme la plupart d'entre vous l'ont fait à plusieurs reprises, il est pratique d'afficher un texte long en utilisant less
:
some_command | less
Maintenant, son stdin est connecté à un tuyau (FIFO). Comment peut-il encore lire des commandes comme monter/descendre/quitter ?
Réponse acceptée :
Comme mentionné par William Pursell, less
lit les frappes de l'utilisateur depuis le terminal. Il ouvre explicitement /dev/tty
, le terminal de contrôle ; qui lui donne un descripteur de fichier, distinct de l'entrée standard, à partir duquel il peut lire l'entrée interactive de l'utilisateur. Il peut simultanément lire les données à afficher à partir de son entrée standard si nécessaire. (Il pourrait aussi écrire directement au terminal si nécessaire.)
Vous pouvez voir cela se produire en exécutant
some_command | strace -o less.trace -e open,read,write less
Déplacez-vous dans l'entrée, quittez less
, et regardez le contenu de less.trace
:vous le verrez ouvrir /dev/tty
, et lire à la fois le descripteur de fichier 0 et celui qui a été renvoyé lors de l'ouverture de /dev/tty
(probablement 3).
C'est une pratique courante pour les programmes qui souhaitent s'assurer qu'ils lisent et écrivent sur le terminal. Un exemple est SSH, par exemple lorsqu'il demande un mot de passe ou une phrase secrète.
Comme expliqué par schily, si /dev/tty
ne peut pas être ouvert, less
lira à partir de son erreur standard (descripteur de fichier 2). less
l'utilisation de /dev/tty
a été introduit dans la version 177, sortie le 2 avril 1991.
Si vous essayez d'exécuter cat /dev/tty | less
, comme suggéré par Hagen von Eitzen, less
réussira à ouvrir /dev/tty
mais n'obtiendra aucune entrée jusqu'à ce que cat
le ferme. Ainsi, vous verrez l'écran vide, et rien d'autre jusqu'à ce que vous appuyiez sur Ctrl C tuer cat
(ou tuez-le d'une autre manière); puis less
affichera tout ce que vous avez tapé pendant que cat
était en cours d'exécution et vous permet de le contrôler.