J'ai essayé d'exécuter la commande suivante:
cat | less
Je sais que les deux commandes nécessitent quelque chose de l'entrée standard.
Quand je le lance, c'est ce à quoi je m'attendais: toutes mes entrées vont à cat et je ne pourrai pas envoyer de commandes à moins (éventuellement sans pouvoir quitter le programme avec la commande q
.)
Ce n'est pas ce qui se passe. En fait, cela fonctionne correctement tant que le nombre de lignes envoyées dans l’entrée standard est inférieur au nombre de lignes de l’écran. Lorsque le nombre de lignes envoyées dans l’entrée standard est devenu supérieur au nombre de lignes de ma console, un étrange sentiment s’apparaît. Il semble que l’entrée est parfois envoyée à cat
, parfois à less
. Par exemple, de manière inattendue, la lettre q
parfois laissez le programme quitter.
Pourquoi la raison de ce comportement que je ne m'attendais pas (naïvement)?
la source
echo a|less
il dit 'fin' à la fin, mais pas avec cat | less même quand il frappe moins, avec cat | less, quand il frappe moins, il affiche un signe deux points pour une invite. Ce qui signifie que je suppose qu'il y a plus à l'écran. comme tu dis. Je suppose que la réponse de davidgo à propos de la mise en mémoire tampon pourrait expliquer cela. BTW je remarque juste en tapantless<ENTER>
il ne demande pas de stdin, il est donc intéressant que vous puissiez y accéder.less afilename
acceptera les commandes dans l'entrée standard, etcat afilenime|less
le fera aussi (l’entrée standard n’est-elle pasless
en fait la norme decat
?)Réponses:
Le CAT accepte les entrées de stdin (bien qu’il soit discutable de préférer les entrées d’un fichier ou d’un canal), ET LE SORTIE VERS STDOUT
Cela signifie que l'entrée est simplement canalisée à travers chat, puis dirigée vers moins. Ainsi, vous pouvez voir la sortie en moins.
Vos confusions vont probablement se produire avec la mise en mémoire tampon. CAT met l’entrée en mémoire tampon et la mettra en lot (ou attendra la fin du fichier) lors de son envoi vers moins pour le formatage.
la source
Je me déteste pour dire cela, mais
J'entends par là entrée standard, puis entrée standard. Ou, il y a la lecture du clavier (terminal), et puis il y a lecture du clavier. Essayer
Ça marche comme
ce qui signifie
less
doit avoir un moyen de lire sur le clavier autre que la lecture de l'entrée standard. Voici une autre commande qui fonctionne, même si vous ne vous y attendiez pas:Regarder la
tty
commander . Il indique le nom du terminal (terminal) connecté à l’entrée standard. Cela fonctionne en appelant lattyname
fonction de bibliothèque avec un argument de0
(le descripteur de fichier de l'entrée standard).less
appelle probablementttyname(1)
pour obtenir le nom du terminal (terminal) connecté à la sortie standard. Il ouvre ensuite ce terminal pour la lecture et accepte les commandes de celui-ci. Il ne lit pas les commandes de l'entrée standard. c’est seulement pour les données.Nous avons donc deux processus quasi indépendants (
cat
etless
) indépendamment (simultanément) lecture du clavier (c’est-à-dire le terminal / terminal) sur deux descripteurs de fichiers indépendants. Cette situation est source de confusion et constitue en quelque sorte une «condition de concurrence». Je trouve cela un peu analogue au fonctionnement d’un flipper , dans lequel il y a beaucoup de voies ou chemins que la balle peut prendre - et il faut toujours un ; cela ne peut jamais prendre plus d'un. De même, lorsque plusieurs processus lisent simultanément sur le même terminal, chaque ligne tapée (si le terminal est en mode ligne) ou chaque caractère saisi (si le terminal est en mode caractère) va à exactement un processus. Et la sélection est arbitraire, pas très différente de l'action du flipper. Ce n’est pas complètement «aléatoire», pas plus que la planification des processus est aléatoire; mais c’est essentiellement imprévisible.Alors, voici ce qui se passe:
cat
lit à partir de son entrée standard, qui, par défaut, est le terminal, et écrit sur sa sortie standard, qui est le tuyau àless
.less
appelsttyname(1)
, obtient le nom du terminal sur lequel il est allumé et l'ouvre pour le lire.less
lit un écran plein de données (c'est-à-dire 24 lignes ou autre) de son entrée standard (le tuyau) et l'écrit sur la sortie standard (le terminal).less
émet le:
invite, met le terminal en mode caractère, et commence à lire du terminal ( ne pas de l'entrée standard).cat
etless
) lecture simultanée du terminal, et le phénomène du flipper se déclenche - les personnages (et / ou les lignes) que vous tapez allez àcat
ouless
, semi-aléatoirement. Si ça va àcat
, il est écrit dans le tuyau etless
traite comme des données. Si ça va àless
, il est interprété comme unless
commander.Cela n’a vraiment rien à voir avec la mise en mémoire tampon.
la source
less
vient d'ouvrir/dev/tty
: "/ dev / tty: Dans chaque processus, synonyme du terminal de contrôle associé au groupe de processus de ce processus, le cas échéant. Il est utile pour les programmes ou les procédures shell souhaitant être sûr d'écrire des messages ou de lire des données depuis le terminal, quelle que soit la manière dont la sortie a été redirigée. Il peut également être utilisé pour les applications qui demandent le nom d’un fichier pour la sortie, lorsque la sortie typée est souhaitée et qu’il est fastidieux de savoir quel terminal est actuellement utilisé. " (Posix: pubs.opengroup.org/onlinepubs/9699919799/basedefs/… )