Les séquences de contrôle sur les terminaux Xterm

Retour à la page Systèmes

Motivation

Les forums de bidouilleurs Linux regorgent de recettes magiques pour:

  • Afficher une invite de commande sympa (genre user@hote)
  • ... voire la mettre en couleurs
  • ... et même changer le titre de la fenêtre ou de l'onglet du terminal

Voir en particulier un tutoriel sur Le Site du Zéro qui semble avoir déménagé ici

Cependant ces explications ne précisent presque jamais leurs sources.

On va y remédier à partir d'un petit exemple.

Exemple

Supposons donc que vous entriez cette formule cabalistique:

PS1="\[\e]0;\h\a\]\[\e[34m\][\u@\h \W]\$\[\e[00m\]"

A la lumière des explications qui suivent, vous verrez qu'elle se décompose ainsi:

  • \[\e]0;\h\a\] : Mettre le nom de la machine en titre de fenêtre
  • \[\e[34m\] : Couleur bleue
  • [\u@\h \W]\$ : Afficher [utilisateur@machine repertoire]$
  • \[\e[00m\] : Retour à la couleur normale

Le rôle du bash

Le très long manuel bash informe ceux qui le veulent bien de l'existence d'une variable PS1 qui décrit l'invite de commande.

Lorsqu'il décide d'afficher l'invite de commande, le shell bash regarde la variable PS1 et commence à l'interpréter.
La section PROMPTING du manuel décrit comment cela se passe:
  • Les \h,\u,\W ... pour les noms d'hôte, d'utilisateur, de répertoire ...
  • Les \[...\] pour des caractères à ne pas afficher: en particulier les séquences de contrôle du terminal.
  • Les \e ou \033 pour le caractère littéral ESC
  • Les \a pour le caractère littéral BEL (celui qui fait bip)

Ainsi:

  • \[\e]0;\h\a\] devient ESC ] 0 ; machine BEL
  • \[\e[34m\] devient ESC [ 34 m
  • [\u@\h \W]\$ devient [utilisateur@machine repertoire]$
  • \[\e[00m\] devient ESC [ 00 m

Le rôle du terminal

Le terminal reçoit une chaîne de caractères du bash
Il interpète les séquences de contrôle qu'il reconnaît et il affiche les autres caractères.
Les séquences de contrôle reconnues dépendent évidemment du terminal, mais les comportements des terminaux du monde Linux/Unix sont très similaires.

Pour le bien de la cause, supposons que vous utilisiez le terminal GNOME. Le manuel (ou chercher "Gnome terminal introduction") nous indique qu'il comprend les séquences de type VT102, VT220 et xterm.

Une recherche sur l'Internet des séquences de contrôle Xterm, VT102, etc. donne en particulier Xterm Control Sequences; un document très ressemblant est donné par la page d'aide Linux man console_codes.

Ce document est austère, mais très complet (normal: son auteur Thomas Dickey maintient notamment xterm, ncurses, et lynx), et sa signification sera beaucoup plus claire après interprétation de notre exemple.

Caractères de contrôle 7 bits/8bits

La section C1 (8-Bit) Control Characters nous informe que:
- ESC [ signifie CSI (Control Sequence Introducer)
- ESC ] signifie OSC (Operating System Command)

Ainsi:

  • ESC ] 0 ; machine BEL correspond à OSC 0 ; machine BEL
  • ESC [ 34 m correspond à CSI 34 m
  • [utilisateur@machine repertoire]$ est affiché directement.
  • ESC [ 00 m correspond à CSI 00 m

Choix des couleurs

Dans la section Functions using CSI , ordered by the final character(s)on trouve les lignes suivantes:

CSI Pm m    Character Attributes (SGR)
  0 ==> Normal (default)
  ...
  3 4 ==> Set foreground color to Blue
Ainsi, la séquence CSI 34 m donne:
- Pm = 34 : paramètres numériques séparés par ; s'il y en a plusieurs
- m : fin de séquence

La signification des séquences CSI 34 m (mettre en bleu) et CSI 00 m (couleur normale) est ainsi dévoilée.

Titre de la fenêtre

La section Operating System Controls détaille:

OSC  Ps ; Pt BEL
Ainsi la séquence OSC 0 ; machine BEL donne:
- Ps = 0 : paramètre numérique unique
- Pt = machine
- BEL : fin de séquence

Et quelques lignes plus bas on voit que Ps = 0 correspond à la fonction "Window Title to Pt" comme annoncé

Maintenant, c'est au terminal de décider s'il tient compte ou non de cette fonction.
Par exemple, un utilisateur peut fort bien choisir, dans les préférences du terminal GNOME, de ne pas tenir compte de ces changements de titre.

Pour aller plus loin

On a présenté les séquences de contrôle dans le cadre de la modification d'une invite bash
Mais en fait, le terminal peut recevoir de telles séquences depuis n'importe quel programme qui dialogue avec lui.
  • Par exemple, depuis la ligne de commande bash, vous pouvez taper directement Ctrl-V ESC [ 34 m pour voir votre texte passer en bleu (Ctrl-V sert à entrer un caractère littéral)
  • La librairie ncurses fournit une interface C qui évite de s'embêter avec la génération manuelle des séquences.