Les séquences d'échappement d'ANSI [1] permettent de régler les attributs de l'écran, tels que le texte en gras et la couleur d'affichage et de fond. Les fichiers batch DOS utilisaient communément les séquences d'échappement ANSI pour les affichages couleur, comme peuvent le faire les scripts Bash.
Exemple 34-8. Une base de données d'adresses << colorisée >>
#!/bin/bash
# ex30a.sh: Version "colorisée" de ex30.sh.
# Base de données d'adresses.
clear # Efface l'écran.
echo -n " "
echo -e '\E[37;44m'"\033[1mListe de contacts\033[0m"
# Blanc sur fond bleu
echo; echo
echo -e "\033[1mChoisissez une des personnes suivantes:\033[0m"
# Bold
tput sgr0
echo "(Entrez seulement les premières lettres du nom.)"
echo
echo -en '\E[47;34m'"\033[1mE\033[0m" # Bleu
tput sgr0 # Réinitialise les couleurs à la
#+ "normale."
echo "vans, Roland" # "[E]vans, Roland"
echo -en '\E[47;35m'"\033[1mJ\033[0m" # Magenta
tput sgr0
echo "ones, Mildred"
echo -en '\E[47;32m'"\033[1mS\033[0m" # Vert
tput sgr0
echo "mith, Julie"
echo -en '\E[47;31m'"\033[1mZ\033[0m" # Rouge
tput sgr0
echo "ane, Morris"
echo
read personne
case "$personne" in
# Notez que la variable est entre guillemets.
"E" | "e" )
# Accepte une entrée en majuscule ou minuscule.
echo
echo "Roland Evans"
echo "4321 Floppy Dr."
echo "Hardscrabble, CO 80753"
echo "(303) 734-9874"
echo "(303) 734-9892 fax"
echo "revans@zzy.net"
echo "Business partner & old friend"
;;
"J" | "j" )
echo
echo "Mildred Jones"
echo "249 E. 7th St., Apt. 19"
echo "New York, NY 10009"
echo "(212) 533-2814"
echo "(212) 533-9972 fax"
echo "milliej@loisaida.com"
echo "Girlfriend"
echo "Birthday: Feb. 11"
;;
# Ajoutez de l'info pour Smith & Zane plus tard.
* )
# Option par défaut.
# Une entrée vide (en appuyant uniquement sur RETURN) vient ici aussi.
echo
echo "Pas encore dans la base de données."
;;
esac
tput sgr0 # Réinitialisation des couleurs à la
#+ "normale".
echo
exit 0 |
La séquence d'échappement ANSI la plus simple et peut-être la plus utile est du texte gras, \033[1m ... \033[0m. \033 représente un escape, << [1 >> active l'attribut gras, alors que << [0 >> la désactive. << m >> termine chaque terme de la séquence d'échappement.
bash$ echo -e "\033[1mCeci est un texte en gras.\033[0m" |
Un séquence d'échappement similaire active l'attribut de soulignement (sur un rxvt et un aterm).
bash$ echo -e "\033[4mCe texte est souligné.\033[0m" |
![]() | Avec un echo, l'option -e active les séquences d'échappement. |
D'autres séquences d'échappement modifie le texte et/ou la couleur du fond.
bash$ echo -e '\E[34;47mCeci est affiché en bleu.'; tput sgr0 bash$ echo -e '\E[33;44m'"texte jaune sur fond bleu"; tput sgr0 |
Utiliser le modèle suivant pour écrire du texte coloré sur un fond coloré. echo -e '\E[COLOR1;COLOR2mDu texte vient ici.' Les caractères << \E[ >> commencent la séquence d'échappement. Les nombres << COLOR1 >> et << COLOR2 >> séparés par le point-virgule spécifient une couleur de texte et de fond, suivant la table ci-dessous. (L'ordre des nombres importe peu, car les nombres d'avant et d'arrière-plan tombent dans des échelles qui ne se couvrent pas.) << m >> termine la séquence d'échappement, et le texte commence immédiatement après ça. Notez aussi que les guillemets simples enferment le reste de la séquence de commandes suivant le echo -e. |
Les nombres dans la table suivante fonctionnent pour un terminal rxvt. Les résultats peuvent varier pour d'autres émulateurs de terminaux.
Tableau 34-1. Nombres représentant les couleurs des séquences d'échappement
| Couleur | Avant-plan | Arrière-plan |
|---|---|---|
| noir | 30 | 40 |
| rouge | 31 | 41 |
| vert | 32 | 42 |
| jaune | 33 | 43 |
| bleu | 34 | 44 |
| magenta | 35 | 45 |
| cyan | 36 | 46 |
| blanc | 37 | 47 |
Exemple 34-9. Afficher du texte coloré
#!/bin/bash
# color-echo.sh: Affiche des messages texte en couleur.
# Modifier ce script pour vos besoins propres.
# C'est plus facile que de coder manuellement les couleurs.
noir='\E[30;47m'
rouge='\E[31;47m'
vert='\E[32;47m'
jaune='\E[33;47m'
bleu='\E[34;47m'
magenta='\E[35;47m'
cyan='\E[36;47m'
blanc='\E[37;47m'
alias init="tput sgr0" # Initialise les attributs texte à la normale
#+ sans effacer l'écran.
cecho () # Echo couleur.
# Argument $1 = message
# Argument $2 = couleur
{
local msg_par_defaut="Pas de message."
# N'a pas réellement besoin d'être une variable
# locale.
message=${1:-$msg_par_defaut}# Message par défaut.
couleur=${2:-$noir} # Noir par défaut, si non spécifié.
echo -e "$color"
echo "$message"
init # Retour à la normale.
return
}
# Maintenant, essayons-le.
# ----------------------------------------------------
cecho "Je me sens bleu..." $bleu
cecho "Le magenta ressemble plus à du violet." $magenta
cecho "Vert avec envie." $vert
cecho "Vous voyez rouge?" $rouge
cecho "Cyan, mieux connu sous le nom d'aqua." $cyan
cecho "Pas de couleur précisée (noir par défaut)."
# Argument $color manquant.
cecho "Couleur \"vide\" passée (noir par défaut)." ""
# Argument $color vide.
cecho
# Arguments $message et $color manquants.
cecho "" ""
# Arguments $message et $color vides.
# ----------------------------------------------------
echo
exit 0
# Exercices:
# ---------
# 1) Ajouter l'attribut "gras" à la fonction 'cecho ()'.
# 2) Ajouter des options pour des fonds colorés. |
![]() | Il existe néanmoins un problème majeur avec tout ceci. Les séquences d'échappement ANSI sont généralement non portables. Ce qui fonctionne bien sur certains émulateurs de terminaux (ou la console) peut fonctionner différemment, ou pas du tout, sur les autres. Un script << coloré >> ayant une excellente forme sur la machine de l'auteur du script peut produire une sortie illisible chez quelqu'un d'autre. Ceci compromet grandement l'utilité de la << colorisation >> des scripts, et relègue cette technique au statut de gadget, voire de << jeu >>. |
L'utilitaire color de Moshe Jacobson (http://runslinux.net/projects/color) simplifie considérement l'utilisation des séquences d'échappement ANSI. Il substitue une syntaxe claire et logique aux constructions bizarres dont on vient de discuter.
| [1] | ANSI est, bien sûr, l'acronyme pour << American National Standards Institute >>. |
| Précédent | Sommaire | Suivant |
| Récursion | Niveau supérieur | Optimisations |