GNU/Linux >> Tutoriels Linux >  >> Linux

Comment `less` prend-il des données de Stdin tout en étant toujours capable de lire les commandes de l'utilisateur ?

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.


Linux
  1. Linux :Différence entre /dev/console , /dev/tty et /dev/tty0 ?

  2. Linux – En quoi le lien symbolique /proc//exe diffère-t-il des liens symboliques ordinaires ?

  3. Quelle est la portabilité de /dev/stdin, /dev/stdout et /dev/stderr ?

  4. Comment encoder en base64 /dev/random ou /dev/urandom ?

  5. Comment échanger /dev/sda avec /dev/sdb ?

tty (/dev/tty ) vs pts (/dev/pts) sous Linux

Comment mapper les périphériques /dev/sdX et /dev/mapper/mpathY à partir du périphérique /dev/dm-Z

Comment savoir à partir de quel dossier un processus est en cours d'exécution ?

DD de /dev/zero à /dev/null...ce qui se passe réellement

Linux :Différence entre /dev/console , /dev/tty et /dev/tty0

Comment vérifier si stdin est /dev/null depuis le shell ?