Lorsque j'utilise, less file1 file2
j'obtiens les deux fichiers affichés dans le "visualiseur de mémoire tampon moins", mais less file1 file2 | cat
j'imprime le contenu des deux fichiers ajoutés à stdout. Comment sait-il moins s'il doit afficher "moins de visionneuse de tampon" ou produire une sortie vers stdout pour une prochaine commande? Quel mécanisme est utilisé pour ce faire?
21
bash script.sh
,bash script.sh | cat
,bash script.sh > file
et voir ce que la sortie que vous obtenez.stdout
n'est pas quelque chose qui peut être "écrit dans un fichier". C'est quelque chose que vous devezwrite()
faire .less
n'a rien à faire différemment selon que sa sortie est un fichier, un tube, une socket ou un bloc, ou autre. Il importe seulement que ce ne soit pas un tty, donc il se comporte juste commecat
. (Je suppose que vous le saviez et que vous avez juste choisi les mauvais mots pour l'expliquer, mais je pensais le signaler aux autres lecteurs).less
ne "comprend" pas lacat
prochaine étape. Il se comporte simplement commecat
quoi que ce soit ensuite, si c'est standard, ce n'est pas un tty.less
cela irait de l'avant et utiliser un TCGETS pour obtenir les dimensions du terminal ou découvrir que ce n'était pas un tty, mais apparemment, je me suis trompé.less
vérifie s'ilstdout
s'agit d'un terminal et se comporte commecat
s'il ne l'était pas (copie stdin vers stdout jusqu'à EOF).Cette fonctionnalité vous permet d'écrire des scripts ou des programmes qui envoient toujours leur sortie (par exemple la
--help
sortie)less
tout en permettant une redirection facile vers un fichier. Il serait nul sisome_command --fullhelp > help.txt
on attendait toujours la barre d'espace sur stdin pour parcourir le texte, ou quelque chose. Certaines commandes (par exempleman
) vérifient que leur propre sortie pour décider d'envoyer ou non leur sortie via un pager. Si vous exécutezman ls > ls.txt
, il n'invoque jamais votre$PAGER
.less
Le comportement de chat est pratique si vous oubliez de le modifier à partir d'une ligne unique lorsque vous ajoutez plus d'étapes à un pipeline.less
doit comprendre les dimensions du terminal (taille de l'écran, pour savoir combien de lignes afficher en même temps). Celuiioctl(2)
qu'il utilisestdout
retournerait ENOTTY sur un non-terminal, il ne peut donc pas éviter de gérer le cas non-terminal de toute façon.less
utilise en faitisatty(3)
avant de vérifier les dimensions du terminal, maisisatty
fonctionne en essayant un ioctl uniquement tty et en vérifiant l'absence d'erreur.Même un simple pager comme
more(1)
(au moins la version util-linux) a cette fonctionnalité, car c'est probablement le comportement sain le plus simple à implémenter dans ce cas.Notez que lorsque vous redirigez quelque chose dans
less
(par exemplegrep foo bar.txt | less
), il ne faut ouvrir/dev/tty
pour la saisie du clavier. (Vous pouvez le voir faire cela avececho foo | strace less
).la source