Comme la plupart d'entre vous l'ont fait à maintes 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 toujours lire des commandes comme up / down / quit?
less
lit les données à afficher à partir de stdin, et lit les commandes du tty. Ce sont des choses différentes.less
lit les données de stdin et les commandes du terminal.Réponses:
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; cela 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 des données à afficher à partir de son entrée standard si nécessaire. (Il pourrait aussi écrire directement sur le terminal si nécessaire.)Vous pouvez voir cela arriver en exécutant
Déplacez-vous dans l'entrée, quittez
less
-le et examinez le contenu deless.trace
: vous verrez qu'il s'ouvre/dev/tty
et lit le descripteur de fichier 0 et celui qui a été renvoyé lors de son ouverture/dev/tty
(probablement 3).C'est une pratique courante pour les programmes qui souhaitent s'assurer qu'ils lisent et écrivent sur le terminal. SSH en est un exemple, par exemple lorsqu'il demande un mot de passe ou une phrase secrète.
Comme expliqué par schily , si
/dev/tty
impossible,less
nous lirons son erreur standard (descripteur de fichier 2).less
L'utilisation de de a/dev/tty
été introduite dans la version 177, publiée le 2 avril 1991.Si vous essayez de courir
cat /dev/tty | less
, comme suggéré par Hagen von Eitzen , vousless
réussirez à ouvrir/dev/tty
mais n’obtiendrez aucune information de sa part avant lacat
fermeture. Donc, vous verrez l'écran vide et rien d'autre jusqu'à ce que vous appuyiez sur CtrlCpour tuercat
(ou le tuer d'une autre manière); puisless
montrera tout ce que vous avez tapé pendant que vous étiez encat
cours d’exécution, et vous permettra de le contrôler.la source
cat blah |
peut être remplacé par< blah
, et même cela est inutile dans ce cas puisque celaless blah
fonctionne aussi (bien,less -f /dev/tty
). Mais la lecture de/dev/tty
est un cas un peu spécial, et les trois variantes (cat /dev/tty | less
,less < /dev/tty
etless -f /dev/tty
) produisent des résultats différents./dev/tty
et/dev/pts/...
.UNIX donne deux méthodes pour lire les entrées des utilisateurs lorsque stdin a été redirigé:
La méthode originale est de lire stderr . Stderr est ouvert à l'écriture et à la lecture et cela est toujours mentionné dans POSIX.
Les versions ultérieures d'UNIX (vers 1979) ont ajouté une
/dev/tty
interface de pilote permettant d'ouvrir le contrôle d'un processus. Puisqu'il existe des processus sans tty de contrôle, il est possible qu'une tentative d'ouverture/dev/tty
échoue. Le logiciel écrit amical a donc un recours à la méthode originale et essaie ensuite de lire stderr.la source
dup()
licences de la même description de fichier, bien que tous soient ouverts sur le tty. (Apparemment, POSIX exige ou suggère toujours (cette réponse ne dit pas) que stderr soit une FD en lecture / écriture, non ouverte avec quelque chose commeopen("/dev/ttyS0", O_WRONLY)
. La lecture de stderr échouerait dans ce cas.)