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:

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:

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:

Ainsi:

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:

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.

Dernière modification: 10 novembre 2016