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 |
Example shell scripts at SHELLdorado .
Example shell scripts at Noah Friedman's script site.
Steve Parker's Shell Programming Stuff.
Example shell scripts at SourceForge Snippet Library - shell scrips.
Giles Orr's Bash-Prompt HOWTO.
Very nice sed, awk, and regular expression tutorials at The UNIX Grymoire.
The GNU gawk reference manual (gawk is the extended GNU version of awk available on Linux and BSD systems).
Trent Fisher's groff tutorial.
Mark Komarinski's Printing-Usage HOWTO.
There is some nice material on I/O redirection in chapter 10 of the textutils documentation at the University of Alberta site.
Rick Hohensee has written the osimpa i386 assembler entirely as Bash scripts.
Rocky Bernstein is in the process of developing a << full-fledged >> debugger for Bash.
---
The excellent "Bash Reference Manual", by Chet Ramey and Brian Fox, distributed as part of the "bash-2-doc" package (available as an rpm). See especially the instructive example scripts in this package.
The comp.os.unix.shell newsgroup.