Linux : Séquences Escape-Control pour coloriser les scripts
Sommaire
I. Présentation
A l’ère du digital, on cherche toujours à visualiser les éléments ou à accentuer les composants visuels pour mettre en évidence telle ou telle conclusion. Mais, il faut savoir que sur le shell Linux on peut également utiliser certains artefacts visuels pour mettre en évidence certains éléments.
C’est souvent le cas dans les scripts où l’on souhaite distinguer le cas d’un test positif et/ou négatif. Si l’on reprend un exemple bien connu des administrateurs GNU/Linux : c’est le démarrage ou l’arrêt du système d’exploitation. On trouve très souvent les différentes étapes surlignées par un indicateur [ OK ] ou [ ERROR ] , comme le montre la capture ci-dessous :
En fait, cela est très facilement réalisable sur n’importe quel script, à condition de bien suivre la procédure suivante. En fait, il est possible de coloriser le texte de nos scripts, de le mettre en italique, en gras en surligné, avec un affichage plus intense...
Les cas d’utilisation sont généralement liés au fait de souhaiter :
- Mettre en évidence un point capital. Mais, on ne veut pas que l’utilisateur puisse avoir un contrôle sur les indicateurs. On peut alors utiliser vim pour effectuer la mise en contraste des éléments. Car, l’outil supporte le coloriage, les effets de type surligné, gras, italique… Dans ce cas, on n’a pas la garantie que sur un autre poste vim sera lui aussi configuré de la même manière. La portabilité n’est pas assurée.
- Avoir la possibilité d’utiliser de façon lisible et portable la solution. On doit alors utiliser les codes “escape“ ANSI. Ceux-ci garantissent non seulement la facilité d’utilisation mais également la portabilité et la souplesse.
Ce mode permet de contrôler la couleur du texte ainsi que celle du fond d’écran d’affichage.
ATTENTION : aujourd’hui, la plupart des terminaux supportent ce mode d’affichage. Mais, il se peut que certains anciens VT nécessitent un paramétrage, voire même ne le supporte pas.
La codification est assez compliquée, car elle met en œuvre une séquence de touches multiples. Ainsi, pour la couleur de texte on dispose des contrôles suivants :
- Noir : ESC[30m
- Rouge : ESC[31m
- Vert : ESC[32m
- Jaune : ESC[33m
- Bleu : ESC[34m
- Magenta : ESC[35m
- Cyan : ESC[36m
- Blanc : ESC[37m
- Défaut : ESC[39m
Ensuite, on peut également contrôler la couleur du fond de l’affichage, via les séquences ci-dessous :
- Noir : ESC[40m
- Rouge : ESC[41m
- Vert : ESC[42m
- Jaune : ESC[43m
- Bleu : ESC[44m
- Magenta : ESC[45m
- Cyan : ESC[46m
- Blanc : ESC[47m
- Défaut : ESC[49m
On peut également y ajouter des effets de texte comme le surligné, le gras, l’italique, en utilisant les séquences suivantes :
- Gras : ESC[1m
- Souligné : ESC[4m
- Clignotant : ESC[5m
- Reset/Défaut : ESC[0m
Enfin, il est tout à fait possible de mixer ces composantes pour donner plusieurs effets à un texte ou à un fond d’écran.
Exemple : Pour lister du texte rouge clignotant sur fond blanc, il faudra écrire la séquence : ESC[5 ;31 ;47m
REMARQUE : la symbolique ESC est généralement codifiée, au sein d’un script, par "\033".
II. Ecriture d’un test d’existence de compte
Afin d’illustrer ces propos, nous allons maintenant écrire un script permettant de tester l’existence d’un utilisateur, au sein du système d’exploitation local. Ce que l’on souhaite, c’est en cas d’inexistence, réaliser la création dudit utilisateur.
En cas d’erreur, lors d’une des étapes on affichera alors soit le message [ OK ], soit le message [ ERROR ]. A l’aide des éléments que l’on vu précédemment, on va donc générer notre script. Il s’agit là d’un exemple simpliste, mais on voit très bien comment mettre cela en fonction pour des scripts plus complexes :
# !/bin/bash # Script de tests du compte toto # TSTACCNT=$(getent passwd toto|wc –l) TSTGRP=$(getent group toto|wc –l) if [ $ TSTACCNT –eq 1 ] && [ $TSTGRP –eq 1 ] then echo –en "Compte deja existant.\n" $(userdel toto ; rm –fR /var/spool/mail/toto ;rm –fR /home/toto) if [ $ ? –ne 0 ] then echo "Suppression du compte toto existant \t" echo –en "[\033[01;31m ERROR \033[0m]\n" else echo "Suppression du compte toto existant \t" echo –en "[\033[01;32m ERROR \033[0m]\n" fi fi echo –en "Création du compte toto \t\t" $(useradd toto 1>/dev/null)“ [[ $ ? –eq 0 ]] && { echo –en "\E[01;32m”\033[1m OK \033[0m]\n" echo –en "Initialisation du compte toto\n" passwd toto << EOF 2> &1 > /dev/null toto toto EOF echo –en "\n" } if [ $ ? –ne 0 ] then echo "Initialisation du compte \t\t" echo –en “[\033[01;31m ERROR \033[0m]\n“ else echo "Initialisation du compte \t\t" echo –en "[\033[01;32m OK \033[0m]\n" fi exit 0
REMARQUE : on peut tout à fait banaliser le nom du compte à créer et le passer en paramètre au script. Il suffit de remplacer les chaînes "toto" par $1. On peut aussi personnaliser différemment ce script. Ici, il ne s’agit que d’un exemple.
III. Résultat du script
IV. Cas d’usage
On peut imaginer automatiser la création des comptes sur un système en positionnant un mot de passe par défaut fixe ou généré. Ainsi, grâce à ce script il devient possible de créer les utilisateurs en batterie.
Bien évidemment, on peut aussi utiliser ce genre de mécanisme pour favoriser la visualisation d’informations, au travers, par exemple du fichier d’accueil /etc/motd, comme :
- le nom de la machine,
- la version de son système d’exploitation,
- la distribution
- les services importants actifs (NTP, SSH, etc.)
Alors non, il ne faut surtout pas faire comme ça. Il faut utiliser tput qui sait envoyer la bonne séquence en fonction du terminal.
https://linux.die.net/man/1/tput
Bonsoir,
Je ne suis pas sûr que la réponse que j’ai faite hier soir ait été prise en compte. Aussi j’en refais une ce soir. Je suis d’accord avec vous, il vaut mieux utiliser tput (plus pratique et surtout évitant de saisir les séquences escape).
Toutefois, on n’est plus au temps des terminaux où il fallait configurer, la vitesse d’affichage, l’entrelacement… De plus, revenir aux “basics“ de temps en temps ne fait pas de mal.
Pour finir, je dirais que cela me donnera l’occasion de faire un billet sur tput 🙂
Bonsoir,
Je ne suis pas sûr que la réponse que j’ai faite hier soir ait été prise en compte. Aussi j’en refais une ce soir. Je suis d’accord avec vous, il vaut mieux utiliser tput (plus pratique et surtout évitant de saisir les séquences escape).
Toutefois, on n’est plus au temps des terminaux où il fallait configurer, la vitesse d’affichage, l’entrelacement… De plus, revenir aux “basics“ de temps en temps ne fait pas de mal.
Pour finir, je dirais que cela me donnera l’occasion de faire un billet sur tput 🙂
Ben voila, j’ai bien fait 😉