<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
  <head>
<!-- this stylesheet will later on be added by lfparser automatically: -->
<style type="text/css">
<!--
  pre { font-family:monospace,Courier }
  pre.code { font-family:monospace,Courier;background-color:#aedbe8; }
  p.code { width:80%; alignment:center; background-color:#aedbe8; 
        border-style:none; border-width:medium; border-color:#aedbe8; 
        padding:0.1cm ; text-align:left }
-->
</style>

    <title></title>
  </head>

  <body>
    <!--    <h1>Bunte Shells - Benutzung der Shellfarben</h1>-->

    <h1>Le shell en couleur : du bon usage des codes couleur ANSI</h1>

    <h4>ArticleCategory: Hardware</h4>
    SystemAdministration 

    <h4>AuthorImage:[Here we need a little image from you]</h4>
    <img src="../../common/images2/NicoGolde.jpg" alt=
    "[Photo of the Author]" width="136" height="207"> 

    <h4>TranslationInfo:[Author + translation history. mailto: or
    http://homepage]</h4>

    <p>original in de <a href="nospam:nico/at/ngolde.de">Nico
    Golde</a></p>

    <p>de to en <a href=
    "nospam:sept.sapins(at)verizon.net">J&uuml;rgen Pohl</a></p>
    
    <p>en to fr <a href=
    "nospam:guillaume.baudot@caramail.com">Guillaume Baudot</a></p>

    <h4>AboutTheAuthor:[A small biography about the author]</h4>

    <p>&Agrave; l'heure actuelle, Nico est encore &eacute;tudiant. Depuis
    quelques ann&eacute;es, il s'est beaucoup impliqu&eacute; dans le monde de
    Linux, notamment en prenant part &agrave; un certain nombre de projets Open
    Source.</p>

    <h4>Abstract:</h4>
    <p>Dans un terminal compatible ANSI (comme xterm, rxvt, konsole...), il est
    parfaitement possible de pr&eacute;senter du texte autrement qu'en noir et blanc.
    Cet article vous montrera comment afficher vos textes en gras ou en
    couleurs.

    <h4>ArticleIllustration:</h4>
    <img src="../../common/images2/illustration335.gif" alt=
    "ansi colors" hspace="10" width="220" height="139"> 

    <h4>ArticleBody:</h4>

    <h2>G&eacute;n&eacute;ralit&eacute;s</h2>
    <p>Dans son utilisation quotidienne, tout utilisateur est confront&eacute;
    &agrave; un moment ou un autre au shell. Au premier abord, cela peut
    sembler plut&ocirc;t ennuyeux, mais les possibilit&eacute;s sont nombreuses
    pour agr&eacute;menter ce dernier d'une touche personnelle. Rien qu'en
    ajoutant de la couleur &agrave; l'invite de commande, on peut personnaliser
    le shell tout en am&eacute;liorant sa lisibilit&eacute;.</p>
    <p>Dans cet article, j'utilise Bash comme shell de r&eacute;f&eacute;rence.
    La s&eacute;quence d'&eacute;chappement peut diff&eacute;rer en fonction des
    terminaux : nous nous en tiendrons ici au classique terminal ANSI.</p>

    <h2>Configuration du Shell</h2>
    <p>La mise en en couleur du Shell se fait en modifiant le fichier personnel
    de configuration de bash <i>~/.bashrc</i>, voire le fichier global de
    configuration <i>/etc/bashrc</i>. L'apparence de l'invite de commande est
    modifi&eacute;e avec la variable PS1 de <i>bashrc</i>.</p>
    <p>Le plus souvent, cette variable se pr&eacute;sente ainsi :</p>
<table><tr><td>
<pre class="code">
~/.bashrc: PS1="\s-\v\$ "
</pre>
\s affiche le nom du shell, et \v son num&eacute;ro de version. On rajoute
ensuite un $ &agrave; la fin de l'invite. L'int&eacute;r&ecirc;t &eacute;tant
tout relatif, la plupart des distributions mettent en place une invite qui
ressemble &agrave; ceci :
<pre class="code">
~/.bashrc: PS1="\u@\h \w \$ "
</pre>
</td></tr></table>
    <p>L'invite de commande affiche alors "utilisateur@h&ocirc;te
    r&eacute;pertoire-courant $", ce qui devrait sembler familier &agrave; la
    plupart des utilisateurs de Linux.</p>

    <h2>Les s&eacute;quences d'&eacute;chappement</h2>
    <p>Pour ajouter une touche de couleur &agrave; l'invite, nous utiliserons
    une s&eacute;quence d'&eacute;chappement : il s'agit d'une instruction de
    contr&ocirc;le qui indique au shell une op&eacute;ration sp&eacute;cifique
    &agrave; ex&eacute;cuter. En g&eacute;n&eacute;ral, une telle
    instruction commence par ESC, d'o&ugrave; son nom. Cette s&eacute;quence
    s'affiche dans le shell sous la forme ^[. Pour vous familariser un peu avec
    la syntaxe, apprenez que \033 est &eacute;quivalent : le code ASCII de ESC
    est 27 en d&eacute;cimal, soit 33 en base octale.</p>
    <p>Pour entrer une s&eacute;quence d'&eacute;chappement dans le shell, elle
    doit &ecirc;tre pr&eacute;c&eacute;d&eacute;e de ctrl-v : <i>CTRL-v
    ESC</i>.</p>

    <h2>Utiliser les couleurs du Shell</h2>
    <p>Comme un bon exemple vaut souvent mieux qu'un long discours, nous
    n'allons pas d&eacute;roger &agrave; la r&egrave;gle.</p>
<pre class="code">
~/.bashrc: PS1="\[\033[0;32;40m\u@\h:\w\$ \]"
</pre>
    <p>Cela affiche la totalit&eacute; de l'invite du shell en vert, comme
    ci-dessous :</p>
    <center>
      <table cellpadding="10" border="0">
        <tbody>
          <tr>
            <td colspan="1" bgcolor="#000000" rowspan="1"><font
            color="#00ff00">nico@ebrain:~$</font></td>
          </tr>
        </tbody>
      </table>
    </center>
    <p>\033 indique une s&eacute;quence d'&eacute;chappement, puis le [ marque
    le d&eacute;but de la d&eacute;finition de couleur. Le 0 qui suit
    correspond &agrave; la police par d&eacute;faut (je reviendrais dessus plus
    tard). La cha&icirc;ne est plac&eacute;e entre des crochets (\[ et \]) pour
    &eacute;viter qu'elle ne s'affiche dans le shell et prenne trop d'espace.</p>
    <p>Nous d&eacute;finissons ensuite la couleur des caract&egrave;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&eacute;quence d'&eacute;chappement avec \033[0m, ce qui correspond
    &agrave; la couleur par d&eacute;faut du shell. Pour le fond comme pour les
    caract&egrave;res, 8 couleurs sont disponibles.</p>
    <center><table cellpadding="10" border="0">
      <tbody>
        <tr><th>Couleur</th><th>Texte</th><th>Arri&egrave;re-plan</th></tr>
        <tr><td>Noir</td><td>30</td><td>40</td></tr>
        <tr><td>Rouge</td><td>31</td><td>41</td></tr>
        <tr><td>Vert</td><td>32</td><td>42</td></tr>
        <tr><td>Jaune</td><td>33</td><td>43</td></tr>
        <tr><td>Bleu</td><td>34</td><td>44</td></tr>
        <tr><td>Magenta</td><td>35</td><td>45</td></tr>
        <tr><td>Cyan</td><td>36</td><td>46</td></tr>
        <tr><td>Blanc</td><td>37</td><td>47</td></tr>
      </tbody>
    </table></center>
    <p>Un nouvel exemple :</p>
<pre class="code">
~/.bashrc: PS1="\[\033[0;37;44m\u@\033[0;32;43m\h:\033[0;33;41m\w$\033[0m\]"
</pre>
    <p>Cela donne une invite des plus color&eacute;es, comme vous pouvez le
    constater :</p>

    <center>
      <table cellpadding="10" border="0">
        <tbody>
          <tr>
            <td colspan="1" bgcolor="#000000" rowspan="1">
              <table cellpadding="0" border="0" cellspacing="0">
                <tbody>
                  <tr>
                    <td colspan="1" bgcolor="#0000ff" rowspan="1">
                    <font color="#ffffff">nico@</font></td>

                    <td colspan="1" bgcolor="#aa5500" rowspan="1">
                    <font color="#00ff00">ebrain:</font></td>

                    <td colspan="1" bgcolor="#ff3030" rowspan="1">
                    <font color="#aa5500">~$</font></td>
                  </tr>
                </tbody>
              </table>
            </td>
          </tr>
        </tbody>
      </table>
    </center>
    <p>Pour faire vos tests, vous utiliserez la commande <i>export
    PS1="cha&icirc;ne"</i>, et une fois satisfait, vous pourrez int&eacute;grer
    cette variable dans <i>.bashrc</i>. Actuellement, mon invite de commande
    est configur&eacute;e comme suit :</p>
<pre class="code">
PS1="\[\033[1;34;40m[\033[1;31;40m\u@\h:\w\033[1;34;40m]\033[1;37;40m $\033[0;37;0m\] "
</pre>
    <br>

    <center>
      <table cellpadding="10" border="0">
        <tbody>
          <tr>
            <td colspan="1" bgcolor="#000000" rowspan="1"><b><font
            color="#0000ff">[</font> <font color=
            "#ff0000">nico@ebrain:~</font> <font color=
            "#0000ff">]</font></b> </td>
          </tr>
        </tbody>
      </table>
    </center>

    <h2>Propri&eacute;t&eacute;s du texte</h2>
    <p>Comme indiqu&eacute; plus haut, le z&eacute;ro apr&egrave;s la
    premi&egrave;re s&eacute;quence d'&eacute;chappement pr&eacute;cise le
    format de la police &agrave; utiliser. Les valeurs significatives sont
    0, 1, 21, 4, 24, 5, 25, 7, 27 et ont respectivement pour effet :
    normal, gras, non gras, soulign&eacute;, non soulign&eacute;, clignotant,
    non clignotant, invers&eacute;, non invers&eacute;.</p>
    <p>Pour vous aider &agrave; mieux comprendre les combinaisons possibles,
    voyez ce que donne l'ex&eacute;cution du script ci-dessous :</p>
<pre class="code">
#!/bin/sh
############################################################
# Nico Golde &lt;nico(at)ngolde.de&gt; 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
</pre>
    <p>Vous pourrez t&eacute;l&eacute;charger ce script sous forme d'archive
    compress&eacute;e &agrave; cette adresse : <a shape="RECT"
    href="../../common/src2/article335/showansicol.tar.gz">
    showansicol.tar.gz</a>.</p>
    <p><font size="-1">N.d.T. : vous pouvez tout aussi bien faire un
    copier/coller du script pr&eacute;sent sur cette page et auquel j'ai
    apport&eacute; une l&eacute;g&egrave;re modification d'ordre
    esth&eacute;tique.</font></p>

    <h2>Possibilit&eacute;s d'application</h2>
    <p>La possibilit&eacute; qui nous est offerte de d&eacute;finir les couleurs
    du shell ne sert pas qu'&agrave; embellir l'invite de commande, cela peut
    &ecirc;tre tout aussi utile si vous d&eacute;veloppez des programmes en mode
    console.</p>
    <p>Pour introduire de la couleur dans vos programmes, il vous faudra faire
    appel &agrave; des biblioth&egrave;ques comme <i>slang</i> ou <i>ncurses</i>,
    ce qui n'est pas sans incidence sur la taille des ex&eacute;cutables.
    <i>Ncurses</i> pr&eacute;sente l'avantage d'&ecirc;tre plus ou moins
    ind&eacute;pendant du type de terminal.</p>

    <h2>Un exemple en C</h2>
    <p>Le classique "Hello World" en vert :</p>
<pre class="code">
#include &lt;stdio.h&gt;
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;
}
</pre>
    <p>Une autre s&eacute;quence d'&eacute;chappement bien utile est \033[2J.
    La commande <i>printf("\033[2J")</i> a le m&ecirc;me effet que
    <i>system(clear)</i>, mais avec cet avantage de ne pas n&eacute;cessiter
    l'inclusion du fichier <i>unistd.h</i>.</p>
    <p>Ou encore, la commande <i>printf("\033[1K")</i> efface une ligne.</p>

    <h2>Exemple de script de d&eacute;marrage</h2>
    <p>Les scripts de d&eacute;marrage pr&eacute;sents dans <i>/etc/init.d</i>
    signalent traditionnellement par un <i>'.'</i> le fait que le service
    concern&eacute; a &eacute;t&eacute; correctement lanc&eacute;. Il est bien
    plus &eacute;l&eacute;gant d'afficher un message intelligible et, pourquoi
    pas en couleur, avec l'aide d'une s&eacute;quence d'&eacute;chappement
    (comme c'est dor&eacute;navant le cas dans la plupart des distributions).</p>
    <p>Voici un extrait du script <i>/etc/init.d/cron</i> :</p>
<pre class="code">
#!/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 "."
;;

</pre>
    <p>Un d&eacute;marrage r&eacute;ussi de <i>cron</i> est indiqu&eacute; par
    un point. Il suffit de changer la ligne commen&ccedil;ant par <i>echo</i>
    pour afficher un superbe [OK] en couleur, comme ceci :</p>
<pre class="code">
#!/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\]"
    ;;
</pre>
    <p>Appliquer manuellement cette modification &agrave; tous les scripts
    <i>init</i> peut toutefois s'av&eacute;rer long et fastidieux.</p>

    <h2>R&eacute;actions</h2>
    <p>Vous avez des r&eacute;actions et autres critiques &agrave; &eacute;mettre,
    vous avez trouv&eacute; un bug ?.. Envoyez un mail &agrave;
    "nico(@)ngolde.de". Et amusez-vous bien !
  </body>
</html>