Y a-t-il une raison pour laquelle je reçois ^ [[A lorsque j'appuie sur la flèche vers le haut à l'écran de connexion de la console?


32

Chaque fois que je suis connecté à la console, j'appuie upintentionnellement sur la flèche pour voir les commandes précédemment saisies. Mais je vois ça ^[[A.

Mais lorsque j'appuie sur une Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Wintouche, aucun caractère n'est répercuté.

Quelle pourrait être la raison derrière?

Est-ce que le ^[[Agenre de personnage implique quelque chose?

entrez la description de l'image ici

Réponses:


20

C'est ainsi que le terminal représente le keycode brut de la touche Up qui lui est envoyé par le clavier. En gros, votre shell intercepterait normalement la frappe, mais rien à faire à l'invite de connexion. Ainsi, le caractère que vous avez tapé est imprimé sur la console comme toute autre lettre (ou chiffre, ou autre).


3
@RubanSavvy Ctrl, Alt et Win (souvent appelés Super dans le monde GNU / Linux) sont des modificateurs. Si vous appuyez sur eux et sur une touche, vous verrez quelque chose de différent imprimé à l'écran. Le verrou de défilement que je soupçonne est interprété par le noyau ou par quelque chose d'autre de bas niveau, pour le contrôle de terminal, bien que je ne sois pas sûr. Les pages en haut sont probablement avalées par gettyou login, bien que je ne sache pas pourquoi. Les devinettes éclairées disent que l'écran d'impression est interprété spécialement par le noyau pour des raisons historiques. Je ne suis cependant pas sûr à 100%, à l'exception des modificateurs.
Strugee

3
ce qui précède devrait probablement être modifié dans la réponse.
Strugee


19

Les claviers envoient des événements à l'ordinateur. Un événement dit «scan code nnn down» ou «scan code nnn up». À l'autre bout de la chaîne, les applications s'exécutant sur un terminal attendent une entrée sous la forme d'une séquence de caractères. (À moins qu'ils n'aient demandé l'accès brut, comme le serveur X.) Lorsque vous appuyez sur A, le clavier envoie les informations «code de balayage 38 vers le bas». Le pilote de la console recherche son clavier et le transforme en «caractère a» (si aucune touche de modification n'est enfoncée).

Lorsque vous appuyez sur une touche ou une combinaison de touches qui ne génère pas de caractère, les informations doivent être codées en termes de caractères. Quelques touches et combinaisons de touches ont des caractères de contrôle correspondants, par exemple Ctrl+ Aenvoie le caractère (valeur d'octet 1), Returnenvoie le caractère (Ctrl + M, valeur d'octet 13), etc. La plupart des touches de fonction n'ont pas de caractère correspondant et envoient plutôt une séquence de caractères commençant par le caractère (d'échappement, valeur d'octet 27). Par exemple, la clé Upest traduite dans la séquence d'échappement ␛[A(trois caractères: échappement, crochet ouvert, majuscule A).

L'invite de nom d'utilisateur sur la console est stupide et ne comprend pas la plupart des séquences d'échappement. Il ne possède pas les fonctionnalités d'édition de ligne et d'historique auxquelles vous êtes habitués: celles-ci sont fournies par le shell et, tant que vous n'êtes pas connecté, vous n'avez pas de shell. Donc, il affiche simplement la séquence d'échappement. Il n'y a pas de glyphe pour le caractère, il est donc affiché sous la forme ^[. Le ^signe est traditionnellement utilisé comme préfixe pour les caractères de contrôle et échappe à ^[cause de sa valeur d'octet: c'est la valeur d'octet de [moins 64.

Si vous appuyez sur Upà l'invite du shell, la même séquence de 3 caractères est envoyée à votre shell. Le shell interprète cela comme une séquence de commande (généralement pour rappeler l'élément d'historique précédent). Si vous appuyez sur Ctrl+ Vpuis Upà l'invite du shell, la séquence d'échappement est insérée à l'invite: Ctrl+ Vest une commande permettant d'insérer littéralement le caractère suivant au lieu de l'interpréter en tant que commande. Le caractère n'est donc pas interprété comme le début d'une séquence d'échappement. .

Certaines clés ne sont que des modificateurs et ne sont pas transmises aux applications du terminal. Par exemple, lorsque vous appuyez sur Shift, ces informations restent dans le pilote du terminal et sont prises en compte si vous appuyez ensuite sur Apour que le pilote envoie Aà l'application au lieu de a.

De plus, certaines touches de fonction peuvent ne pas être mappées dans votre console.

Pour une vue similaire dans l'interface graphique, voir Quelle est la clé méta de bash?


C'est une excellente réponse, merci Gilles comme toujours.
JoshuaRLi

5

Il ne s'agit pas de la façon dont les clés sont représentées par le "terminal" (c'est-à-dire l'application de l'émulateur de terminal). Ce que vous voyez, c'est le code ANSI ( séquence d'échappement ANSI ) permettant de remonter d'une ligne, mais traduit sous forme imprimable.

  1. Le matériel du clavier envoie des "codes de balayage", mais ceux-ci sont traduits et présentés aux applications de niveau ligne de commande sous forme de caractères. La clé Adevient un simple octet: Asi la touche Maj est enfoncée (ou verrouillé), asinon.

  2. Dans un terminal compatible ANSI, les touches fléchées ne pas envoyer un seul caractère (il n'y a pas de codes pour les flèches dans le jeu de caractères ASCII), mais une « séquence d'échappement » 3 caractères: escape-[-A. Les trois autres touches fléchées sont escape-[-B, C, D.

  3. La même séquence de caractères déplacerait le curseur d’une ligne vers le haut si elle était envoyée (en écho) à un ancien terminal ANSI physique. De nombreux programmes, y compris les émulateurs de terminal, reconnaissent ces séquences de caractères et agissent de manière appropriée: les émulateurs de terminal déplacent le curseur vers le haut (c'est ainsi que la cursesbibliothèque le déplace), mais bashl'interceptent et font défiler l'historique.

  4. Pour éviter que le curseur ne se retrouve partout dans les programmes qui ne servent à rien de déplacer le curseur sur l'écran, vous verrez souvent ESC en entrée au clavier, affiché comme séquence imprimable ^[(parce que d'échappement correspond à control-[). Ceci est en réalité géré par l'interface du terminal; voir stty(1). En conséquence, la flèche vers le haut apparaîtra comme ^[[A. Vous verrez ceci à partir de la ligne de commande si vous tapez cat, appuyez sur Entrée et appuyez sur certaines touches fléchées. C’est aussi ce que vous avez vu sur l’écran de connexion de la console.

Enfin: Control, Altet les autres touches que vous avez mentionnés ne correspondent pas à des séquences de caractères. Ils affectent le caractère envoyé par une autre pression de touche (comme le a/ Aexemple ci-dessus), ou simplement ils ne sont pas mappés au texte. Ces pressions de touche ne peuvent être détectées que par les programmes qui écoutent les événements de clavier. Ils ne peuvent pas être vus en lisant à partir d'une entrée standard (ni être écrits dans un fichier).


3

Ce comportement est différent d'un shell à l'autre. La plupart des shells utilisent une bibliothèque appelée readlinepour modifier les lignes dans l'invite. Voici une référence de commande complète pour cette bibliothèque. Ainsi, lorsqu'une application utilise, readlinevous pouvez modifier et parcourir les lignes à l'aide de cette commande.

Les touches fléchées verticales sont configurées dans readline pour parcourir l'historique des commandes. Et dans la fenêtre de connexion, il n'y a pas d'historique de commandes. C'est pourquoi les caractères ^[[Aet ^[[Bsont imprimés à l'écran. Alors qu'est-ce que ça ^[[Aveut dire?

La page de manuel de bash dit PROMPTING:

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

Les séquences d'échappement pour les touches de direction dans ANSI sont les suivantes:

  • [ValueACurseur vers le haut (où Valuepeut être vide)

  • [ValueBCurseur vers le bas (où Valuepeut être vide)


5
Votre réponse concerne une question différente, car l'invite de connexion est imprimée et traitée par login, ce qui n'est pas lié à bash.
Risto Salminen

1
bashet loginutilisez la même bibliothèque (readline) pour éditer des lignes. La différence est simplement que loginne pas interpréter les touches fléchées verticales comme une commande, comme le bashfait.
chaos

Oui, je l'avoue.
Risto Salminen

La syntaxe bash est censée ressembler à la ^[représentation de escape, mais ce sont des choses différentes. Bash aurait pu utiliser n'importe quelle syntaxe. En fait, lorsque vous écrivez \[A, bash affiche trois caractères: ^[(c. -à- échappement), [, A.
alexis

0

Ce sont des codes d'échappement ANSI . ^[est la notation que votre shell utilise pour afficher un ESCoctet (octet ASCII 27). Votre exemple est donc un octet ESC suivi du texte [A. Comme vous pouvez le voir dans l'article de Wikipedia, ^[[( ESCsuivi de [) est un introducteur de séquence de contrôle ou CSI. CSI Asignifie déplacer le curseur d'une colonne vers le haut.

Si vous souhaitez voir un code d'échappement dans le terminal, tapez CTRL + V, puis une autre séquence de touches. Par exemple, CTRL + V suivi de la flèche vers le haut indique ^[[A.


0

Le shell de commande, par exemple Bash, est le programme qui traduit la flèche vers le haut dans l'action "récupérer la commande précédente". Vous n'avez pas un shell de commande en cours d'exécution.


0

TLDR

Vous courez probablement sh sortie des codes clés bruts générés lorsque vous appuyez sur la touche flèche vers le haut.

Un shell plus avancé comme celui qui bashintercepte ces codes clés et fait quelque chose avec eux. Afficher par exemple la dernière commande de son histoire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.