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 ^[[A
genre de personnage implique quelque chose?
getty
oulogin
, 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.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 dea
.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?
la source
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.
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:
A
si la touche Maj est enfoncée (ou verrouillé),a
sinon.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 sontescape-[-B, C, D
.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
curses
bibliothèque le déplace), maisbash
l'interceptent et font défiler l'historique.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; voirstty(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 tapezcat
, 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
/A
exemple 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).la source
Ce comportement est différent d'un shell à l'autre. La plupart des shells utilisent une bibliothèque appelée
readline
pour modifier les lignes dans l'invite. Voici une référence de commande complète pour cette bibliothèque. Ainsi, lorsqu'une application utilise,readline
vous 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
^[[A
et^[[B
sont imprimés à l'écran. Alors qu'est-ce que ça^[[A
veut dire?La page de manuel de bash dit
PROMPTING
:Les séquences d'échappement pour les touches de direction dans ANSI sont les suivantes:
[ValueA
Curseur vers le haut (oùValue
peut être vide)[ValueB
Curseur vers le bas (oùValue
peut être vide)la source
login
, ce qui n'est pas lié àbash
.bash
etlogin
utilisez la même bibliothèque (readline) pour éditer des lignes. La différence est simplement quelogin
ne pas interpréter les touches fléchées verticales comme une commande, comme lebash
fait.^[
représentation deescape
, 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
.Ce sont des codes d'échappement ANSI .
^[
est la notation que votre shell utilise pour afficher unESC
octet (octet ASCII 27). Votre exemple est donc un octet ESC suivi du texte[A
. Comme vous pouvez le voir dans l'article de Wikipedia,^[[
(ESC
suivi de[
) est un introducteur de séquence de contrôle ou CSI.CSI A
signifie 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
.la source
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.
la source
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
bash
intercepte ces codes clés et fait quelque chose avec eux. Afficher par exemple la dernière commande de son histoire.la source