[LinuxFocus-icon]
<--  | Sommaire  | Carte  | Index  | Recherche

Nouvelles | Archives | Liens | A propos
Ce document est disponible en: English  ChineseGB  Deutsch  Francais  Nederlands  Russian  Turkce  Polish  

[Photo of the Author]
par Nico Golde
<nico/at/ngolde.de>

L´auteur:

À l'heure actuelle, Nico est encore étudiant. Depuis quelques années, il s'est beaucoup impliqué dans le monde de Linux, notamment en prenant part à un certain nombre de projets Open Source.



Traduit en Français par:
Guillaume Baudot <guillaume.baudot /at/ caramail.com>

Sommaire:

 
PDF

Le shell en couleur : du bon usage des codes couleur ANSI

ansi colors

Résumé:

Dans un terminal compatible ANSI (comme xterm, rxvt, konsole...), il est parfaitement possible de présenter du texte autrement qu'en noir et blanc. Cet article vous montrera comment afficher vos textes en gras ou en couleurs.

_________________ _________________ _________________

 

Généralités

Dans son utilisation quotidienne, tout utilisateur est confronté à un moment ou un autre au shell. Au premier abord, cela peut sembler plutôt ennuyeux, mais les possibilités sont nombreuses pour agrémenter ce dernier d'une touche personnelle. Rien qu'en ajoutant de la couleur à l'invite de commande, on peut personnaliser le shell tout en améliorant sa lisibilité.

Dans cet article, j'utilise Bash comme shell de référence. La séquence d'échappement peut différer en fonction des terminaux : nous nous en tiendrons ici au classique terminal ANSI.

 

Configuration du Shell

La mise en en couleur du Shell se fait en modifiant le fichier personnel de configuration de bash ~/.bashrc, voire le fichier global de configuration /etc/bashrc. L'apparence de l'invite de commande est modifiée avec la variable PS1 de bashrc.

Le plus souvent, cette variable se présente ainsi :

~/.bashrc: PS1="\s-\v\$ "
\s affiche le nom du shell, et \v son numéro de version. On rajoute ensuite un $ à la fin de l'invite. L'intérêt étant tout relatif, la plupart des distributions mettent en place une invite qui ressemble à ceci :
~/.bashrc: PS1="\u@\h \w \$ "

L'invite de commande affiche alors "utilisateur@hôte répertoire-courant $", ce qui devrait sembler familier à la plupart des utilisateurs de Linux.

 

Les séquences d'échappement

Pour ajouter une touche de couleur à l'invite, nous utiliserons une séquence d'échappement : il s'agit d'une instruction de contrôle qui indique au shell une opération spécifique à exécuter. En général, une telle instruction commence par ESC, d'où son nom. Cette séquence s'affiche dans le shell sous la forme ^[. Pour vous familariser un peu avec la syntaxe, apprenez que \033 est équivalent : le code ASCII de ESC est 27 en décimal, soit 33 en base octale.

Pour entrer une séquence d'échappement dans le shell, elle doit être précédée de ctrl-v : CTRL-v ESC.

 

Utiliser les couleurs du Shell

Comme un bon exemple vaut souvent mieux qu'un long discours, nous n'allons pas déroger à la règle.

~/.bashrc: PS1="\[\033[0;32;40m\u@\h:\w\$ \]"

Cela affiche la totalité de l'invite du shell en vert, comme ci-dessous :

nico@ebrain:~$

\033 indique une séquence d'échappement, puis le [ marque le début de la définition de couleur. Le 0 qui suit correspond à la police par défaut (je reviendrais dessus plus tard). La chaîne est placée entre des crochets (\[ et \]) pour éviter qu'elle ne s'affiche dans le shell et prenne trop d'espace.

Nous définissons ensuite la couleur des caractères (32, soit vert) puis la couleur de fond (40, du noir). Pour ne pas que le texte qui suit l'invite s'affiche aussi en vert sur fond noir, on refermera la séquence d'échappement avec \033[0m, ce qui correspond à la couleur par défaut du shell. Pour le fond comme pour les caractères, 8 couleurs sont disponibles.

CouleurTexteArrière-plan
Noir3040
Rouge3141
Vert3242
Jaune3343
Bleu3444
Magenta3545
Cyan3646
Blanc3747

Un nouvel exemple :

~/.bashrc: PS1="\[\033[0;37;44m\u@\033[0;32;43m\h:\033[0;33;41m\w$\033[0m\]"

Cela donne une invite des plus colorées, comme vous pouvez le constater :

nico@ ebrain: ~$

Pour faire vos tests, vous utiliserez la commande export PS1="chaîne", et une fois satisfait, vous pourrez intégrer cette variable dans .bashrc. Actuellement, mon invite de commande est configurée comme suit :

PS1="\[\033[1;34;40m[\033[1;31;40m\u@\h:\w\033[1;34;40m]\033[1;37;40m $\033[0;37;0m\] "

[ nico@ebrain:~ ]
 

Propriétés du texte

Comme indiqué plus haut, le zéro après la première séquence d'échappement précise le format de la police à utiliser. Les valeurs significatives sont 0, 1, 21, 4, 24, 5, 25, 7, 27 et ont respectivement pour effet : normal, gras, non gras, souligné, non souligné, clignotant, non clignotant, inversé, non inversé.

Pour vous aider à mieux comprendre les combinaisons possibles, voyez ce que donne l'exécution du script ci-dessous :

#!/bin/sh
############################################################
# Nico Golde <nico(at)ngolde.de> Homepage: http://www.ngolde.de
# Last change: Mon Feb 16 16:24:41 CET 2004
############################################################

for attr in 0 1 4 5 7 ; do
    echo "----------------------------------------------------------------"
    printf "\t\t- ESC[%s;Foreground;Background -\n" $attr
    for fore in 30 31 32 33 34 35 36 37; do
        for back in 40 41 42 43 44 45 46 47; do
            printf '\033[%s;%s;%sm %02s;%02s  ' $attr $fore $back $fore $back
        done
    printf '\033[0m\n'
    done
done

Vous pourrez télécharger ce script sous forme d'archive compressée à cette adresse : showansicol.tar.gz.

N.d.T. : vous pouvez tout aussi bien faire un copier/coller du script présent sur cette page et auquel j'ai apporté une légère modification d'ordre esthétique.

 

Possibilités d'application

La possibilité qui nous est offerte de définir les couleurs du shell ne sert pas qu'à embellir l'invite de commande, cela peut être tout aussi utile si vous développez des programmes en mode console.

Pour introduire de la couleur dans vos programmes, il vous faudra faire appel à des bibliothèques comme slang ou ncurses, ce qui n'est pas sans incidence sur la taille des exécutables. Ncurses présente l'avantage d'être plus ou moins indépendant du type de terminal.

 

Un exemple en C

Le classique "Hello World" en vert :

#include <stdio.h>
int main(void){
  const char *const green = "\033[0;40;32m";
  const char *const normal = "\033[0m";
  printf("%sHello World%s\n", green, normal);
  return 0;
}

Une autre séquence d'échappement bien utile est \033[2J. La commande printf("\033[2J") a le même effet que system(clear), mais avec cet avantage de ne pas nécessiter l'inclusion du fichier unistd.h.

Ou encore, la commande printf("\033[1K") efface une ligne.

 

Exemple de script de démarrage

Les scripts de démarrage présents dans /etc/init.d signalent traditionnellement par un '.' le fait que le service concerné a été correctement lancé. Il est bien plus élégant d'afficher un message intelligible et, pourquoi pas en couleur, avec l'aide d'une séquence d'échappement (comme c'est dorénavant le cas dans la plupart des distributions).

Voici un extrait du script /etc/init.d/cron :

#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0

 case "$1" in
 start)  echo -n "Starting periodic command scheduler: cron"
     start-stop-daemon --start --quiet --exec /usr/sbin/cron

                 echo "."
;;

Un démarrage réussi de cron est indiqué par un point. Il suffit de changer la ligne commençant par echo pour afficher un superbe [OK] en couleur, comme ceci :

#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0
case "$1" in
start)  echo -n "Starting periodic command scheduler: cron"
        start-stop-daemon --start --quiet --exec /usr/sbin/cron
echo "\[ \033[1;34;40m[ \033[1;32;40mOk \033[1;34;40m]\033[0m\]"
    ;;

Appliquer manuellement cette modification à tous les scripts init peut toutefois s'avérer long et fastidieux.

 

Réactions

Vous avez des réactions et autres critiques à émettre, vous avez trouvé un bug ?.. Envoyez un mail à "nico(@)ngolde.de". Et amusez-vous bien !  

Talkback form for this article

Every article has its own talkback page. On this page you can submit a comment or look at comments from other readers:




Site Web maintenu par l´équipe d´édition LinuxFocus
© Nico Golde
"some rights reserved" see linuxfocus.org/license/
http://www.LinuxFocus.org
Translation information:
de --> -- : Nico Golde <nico/at/ngolde.de>
de --> en: Jürgen Pohl <sept.sapins(at)verizon.net>
en --> fr: Guillaume Baudot <guillaume.baudot /at/ caramail.com>

2005-01-21, generated by lfparser version 2.52