.. title: Les séquences de contrôle sur les terminaux Xterm `Retour à la page Systèmes <../systeme.html>`__ - `Motivation <#motivation>`__ - `Exemple <#exemple>`__ - `Le rôle du bash <#bash>`__ - `Le rôle du terminal <#terminal>`__ - `Pour aller plus loin <#plus>`__ .. _motivation: 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: Exemple ------- Supposons donc que vous entriez cette formule cabalistique: .. code:: bash 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 .. _bash: 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`` .. _terminal: 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: 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. .. _plus: 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.