Certaines touches de votre clavier ne correspondent pas à des caractères réels. Par exemple, Acorrespond au caractère a
mais les touches Upet F1n'ont pas leurs propres caractères dédiés. Lorsque ces touches spéciales sont enfoncées, au lieu d'obtenir un seul caractère correspondant à la touche, le terminal traduit la pression de touche en une séquence spéciale de plusieurs caractères qui commence généralement par le caractère d'échappement (généralement affiché comme ^[
). Par exemple, Upgénère généralement la séquence ^[[A
(c'est-à-dire 3 caractères à partir d'une seule touche: d'échappement,, [
et A
).
La raison que vous ne voyez normalement pas ^[[A
est que la plupart des applications de console sont suffisamment intelligentes pour traduire les séquences spéciales en commandes utiles au lieu de simplement les reproduire sur la console. Pour ce faire, ils désactivent l'écho intégré du terminal et effectuent leur propre traitement de niveau inférieur. Par exemple, quand bash
voit ^[[A
, il se rend compte que ¹ des moyens que vous pressés Upet plutôt que de l' écho en ^[[A
arrière, il fait un tas de choses à supprimer tout ce que vous avez tapé jusqu'à présent, chercher la commande précédente enregistrée dans l' histoire, et qu'au lieu d' imprimer.
Si vous voyez ^[[A
lorsque vous appuyez sur Up, cela signifie généralement que l'écho du terminal est activé et que le processus de premier plan (celui qui contrôle le terminal) n'effectue aucun des traitements spéciaux mentionnés ci-dessus. Cela peut être dû au fait que l'application ignore simplement le terminal (comme la plupart des commandes non interactives). Notez que généralement, le shell met le terminal en mode canonique et active l'écho avant d'exécuter un processus de premier plan, et restaure ses propres paramètres une fois qu'il reprend le contrôle du terminal après la fin de la commande.
L'écho semble assez inoffensif. N'oubliez pas que si la commande en cours d'exécution ne lit pas depuis le terminal, les caractères que vous avez générés via le clavier finiront probablement dans bash
la file d'attente d'entrée de, alors faites attention à ce que vous tapez car ils seront probablement interprétés comme des commandes normales une fois la bash
lecture reprise du terminal.
¹ Il s'agit en fait d'une simplification excessive. Étant donné que la séquence spécifique peut varier selon le type de terminal, il existe généralement plusieurs couches de bibliothèques d'abstraction entre une application console et le terminal lui-même. Par exemple, bash
utilise la readline
bibliothèque pour effectuer la plupart de ses entrées.