34.5. << Coloriser >> des scripts

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"
	      

Note

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
	      
tput sgr0 restaure les paramétrages du terminal en normal. L'omettre laisse toute sortie ultérieure à partir de ce terminal en bleu.

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

CouleurAvant-planArrière-plan
noir3040
rouge3141
vert3242
jaune3343
bleu3444
magenta3545
cyan3646
blanc3747

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.

Attention

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.

Notes

[1]

ANSI est, bien sûr, l'acronyme pour << American National Standards Institute >>.

>

Example shell scripts at SHELLdorado .

Example shell scripts at Noah Friedman's script site.

Steve Parker's Shell Programming Stuff.

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.

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.

The manpages for bash and bash2, date, expect, expr, find, grep, gzip, ln, patch, tar, tr, bc, xargs. The texinfo documentation on bash, dd, m4, gawk, and sed.

ALIGN="left" VALIGN="top" >PrécédentSommaireSuivantConstructeurs de listesNiveau supérieurFichiers