Another Home Page Blog - htophttps://blog.anotherhomepage.org/2011-12-05T08:40:00+01:00Couleurs dans le terminal2011-12-05T08:40:00+01:002011-12-05T08:40:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2011-12-05:/post/2011/12/05/couleurs-dans-le-terminal/<p>Pour beaucoup de gens, la vue d'un terminal, en général en texte blanc sur fond noir (mais aussi en noir sur fond blanc ou beige sur certaines distributions), peut s'avérer très peu attrayante. En ce qui me concerne je me suis accommodé et j'ai fini par apprécier le terminal, grâce …</p><p>Pour beaucoup de gens, la vue d'un terminal, en général en texte blanc sur fond noir (mais aussi en noir sur fond blanc ou beige sur certaines distributions), peut s'avérer très peu attrayante. En ce qui me concerne je me suis accommodé et j'ai fini par apprécier le terminal, grâce à quelques modifications cosmétiques apportant de la couleur. Je trouve ainsi mon environnement beaucoup plus lisible.</p>
<h2>Le prompt</h2>
<p>Dans bash (et probablement dans d'autres shells), il est possible de modifier l'apparence du prompt via la variable d'environnement <em>PS1</em>. Regardons quelle est la valeur de PS1 sur un système CentOS (les simples quotes visent à montrer qu'il y a un espace à la fin) :</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">root@orgrimmar ~</span><span class="o">]</span><span class="err">#</span><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="ss">"PS1 vaut: '$PS1'"</span><span class="w"></span>
<span class="n">PS1</span><span class="w"> </span><span class="nl">vaut</span><span class="p">:</span><span class="w"> </span><span class="s1">'[\\u@\\h \\W]\\$ '</span><span class="w"></span>
</code></pre></div>
<p>Il est possible d'en modifier l'apparence avec de nombreux paramètres, tels que la couleur, certaines informations. Par exemple, j'ai choisi d'appliquer la personnalisation suivante sur tous mes environnements bash :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@arreat</span><span class="err">:</span><span class="o">~</span><span class="err">$</span><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="ss">"PS1 vaut: '$PS1'"</span><span class="w"></span>
<span class="n">PS1</span><span class="w"> </span><span class="nl">vaut</span><span class="p">:</span><span class="w"> </span><span class="s1">'\\[\\]\\u\\[\\]@\\[\\]\\h\\[\\]:\\w\\[\\]\\$\\[\\] '</span><span class="w"></span>
</code></pre></div>
<p>Ce qui est gênant, c'est que si ma variable d'environnement possède des couleurs, leurs codes ne sont pas affichés mais directement interprétés. En réalité, ma variable PS1 vaut :</p>
<div class="highlight"><pre><span></span><code># récupartion depuis mon bashrc :
PS1=$'\\[\\E[01;32m\\]\\u\\[\\E[0m\\]@\\[\\E[01;36m\\]\\h\\[\\E[0m\\]:\\w\\[\\E[01;32m\\]\\$\\[\\E[0m\\] '
</code></pre></div>
<p>Le nom d'utilisateur et le signe "\$" sont verts, tandis que le nom d'hôte est bleu. J'ai réalisé une variante pour l'utilisateur root où le vert est remplacé par du rouge.</p>
<p>Pour essayer, rien de plus simple : il suffit d'exporter la variable d'environnement PS1 avec une nouvelle valeur :</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">root@orgrimmar ~</span><span class="o">]</span><span class="err">#</span><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="ss">"PS1 vaut: '$PS1'"</span><span class="w"></span>
<span class="n">PS1</span><span class="w"> </span><span class="nl">vaut</span><span class="p">:</span><span class="w"> </span><span class="s1">'[\\u@\\h \\W]\\$ '</span><span class="w"></span>
<span class="o">[</span><span class="n">root@orgrimmar ~</span><span class="o">]</span><span class="err">#</span><span class="w"> </span><span class="n">PS1</span><span class="o">=</span><span class="err">$</span><span class="s1">'\\[\\E[01;32m\\]\\u\\[\\E[0m\\]@\\[\\E[01;36m\\]\\h\\[\\E[0m\\]:\\w\\[\\E[01;32m\\]\\$\\[\\E[0m\\] '</span><span class="w"></span>
<span class="n">root</span><span class="nv">@orgrimmar</span><span class="err">:</span><span class="o">~</span><span class="err">#</span><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="ss">"PS1 vaut: '$PS1'"</span><span class="w"></span>
<span class="n">PS1</span><span class="w"> </span><span class="nl">vaut</span><span class="p">:</span><span class="w"> </span><span class="s1">'\\[\\]\\u\\[\\]@\\[\\]\\h\\[\\]:\\w\\[\\]\\$\\[\\] '</span><span class="w"></span>
</code></pre></div>
<p>Il est possible d'aller plus loin, comme de remplacer \\h par \\H pour obtenir le nom complet de la machine, d'insérer la date, d'afficher le prompt en gras... Vous trouverez chez <a href="http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/" title="Nixcraft">Nixcraft</a> les différents codes pour démarrer et stopper une couleur, ainsi que pour la mise en gras.</p>
<p>Si vos expérimentations amènent un résultat peu plaisant, deux possibilités : la première consiste à appliquer de nouveau l'ancienne valeur PS1, si vous avez copié son contenu ailleurs, ou d'aller le chercher par exemple dans /etc/bashrc ; la deuxième consiste tout simplement à fermer puis relancer votre terminal.</p>
<p>Une fois que votre nouveau prompt vous plaît, vous voulez rendre le changement définitif. Il est possible d'éditer son fichier <em>.bashrc</em>, <em>.bash_profile</em> ou <em>.profile</em> pour cela. Si vous souhaitez que ce changement soit effectif pour tous les utilisateurs, il est possible de modifier directement <em>/etc/profile</em> ou <em>/etc/bashrc</em>, mais je ne vous le recommande pas : il est possible de mal éditer le fichier et de supprimer accidentellement des commandes utiles, et donc de mettre en vrac son système.</p>
<p>Pour CentOS/RHEL/Fedora, j'ai pris l'habitude de créer un fichier nommé <em>/etc/profile.d/prompt.sh</em> : en effet, le fichier <em>/etc/profile</em> de ces distributions charge tous les .sh situés dans <em>/etc/profile.d</em>. Il devient donc aisé d'ajouter ou de retirer des personnalisations shell comme des alias, le prompt, et d'autres variables d'environnement qui affecteront tous les utilisateurs.</p>
<p>Pour NetBSD, j'ai choisi de créer un fichier <em>/usr/pkg/etc/bashrc</em> contenant ces personnalisations, et d'ajouter le contenu suivant dans <em>/etc/profile</em> (qui, par défaut, ne contient que des commentaires) :</p>
<div class="highlight"><pre><span></span><code>if [ "<span class="cp">${</span><span class="n">BASH_no</span><span class="cp">}</span>" != "no" ]; then
[ -r /usr/pkg/etc/bashrc ] <span class="err">&&</span> . /usr/pkg/etc/bashrc
fi
</code></pre></div>
<h2>De la couleur dans ls</h2>
<p>Selon votre système, cette option peut ne pas être disponible : cela fonctionne avec CentOS 4 et 5, mais pas avec NetBSD. Il s'agit tout simplement d'utiliser l'option <em>--color</em>, qui peut être complétée, par exemple <em>--color=auto</em> ou <em>--color=tty</em>. D'où viennent ces couleurs ? De la variable d'environnement LS_COLORS. On peut donc modifier cette variable pour afficher les couleurs différemment, et consulter la page de manuel de <a href="http://pwet.fr/man/linux/commandes/dircolors" title="dircolors">dircolors</a> pour plus de détails.</p>
<h2>Grep</h2>
<p>La commande <em>grep</em> possède une option <em>--color</em>, parfois activée par défaut dans un alias sur certaines distributions. Elle colore en rouge la chaîne de caractères recherchée, que ce soit sous CentOS ou NetBSD.</p>
<h2>Pages de manuel en couleur</h2>
<p><em>most</em> permet de visualiser un texte, comme <em>more</em> ou <em>less</em>. A la différence de ces deux derniers, <em>most</em> affiche les pages de manuel en couleur. Pour cela, vous pouvez utiliser la commande suivante :</p>
<div class="highlight"><pre><span></span><code>PAGER=most man <votrecommande>
</code></pre></div>
<p>Pour que ce soit définitif, exportez la variable d'environnement <em>PAGER=most</em>. Attention toutefois, vérifiez que vous n'avez pas un <em>PAGER=more</em> qui traîne quelque part. Concernant la disponibilité du package, on peut le trouver dans <a href="http://pkgsrc.se/misc/most" title=""most">pkgsrc</a> ainsi que dans <a href="http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/" title=""most">RPMForge</a>.</p>
<h2>Colorer ses fichiers de log</h2>
<p>Un outil très pratique pour avoir des fichiers de log en couleurs est <a href="http://freecode.com/projects/ccze" title="ccze">ccze</a>. Il m'arrive de l'utiliser de la manière suivante :</p>
<div class="highlight"><pre><span></span><code>tail -f /chemin/vers/mon/log/apache | ccze
</code></pre></div>
<p>Je peux aussi m'en servir sur un fichier qui n'est pas mis à jour en direct, en duo avec less :</p>
<div class="highlight"><pre><span></span><code>ccze -A < monfichierdelog | less -R
</code></pre></div>
<p>Ce petit bijou connaît de nombreux formats de fichiers de log, et les rend du coup plus agréables à lire. C'est disponible dans <a href="http://pkgsrc.se/sysutils/ccze" title=""ccze">pkgsrc</a> et dans <a href="http://download.fedora.redhat.com/pub/epel/6/x86_64/repoview/ccze.html" title=""ccze">EPEL</a></p>
<h2>Un top en couleur ?</h2>
<p><a href="http://htop.sourceforge.net/" title="htop">Htop</a> est une version “améliorée” de top qui, en plus d'afficher la couleur, affiche les taux d'occupation processeur et mémoire d'une manière un peu “graphique”. A noter cependant que cet outil est d'abord développé pour Linux, et qu'il faut, sous NetBSD, monter <em>/proc</em> avec l'option “linux” (celle-ci est cependant différente de la couche de compatibilité binaire linux). Htop est disponible dans <a href="http://pkgsrc.se/sysutils/htop" title=""htop">pkgsrc</a> et dans <a href="http://download.fedora.redhat.com/pub/epel/6/x86_64/repoview/htop.html" title=""htop">EPEL</a></p>
<h2>Coloration syntaxique avec VIm</h2>
<p>Vous trouvez <em>vi</em> trop morne et déprimant ? Installez <a href="http://www.vim.org/" title="VIm">VIm</a> et activez la coloration syntaxique ! Souvent, seul <em>vi</em> est installé. Côté pkgsrc, le package se nomme <a href="http://pkgsrc.se/editors/vim" title=""vim">vim</a> et a pour dépendance <a href="http://pkgsrc.se/editors/vim-share" title=""vim-share">vim-share</a>. Côté Red Hat, on installera <em>vim-enhanced</em> (dispo dans les dépôts de base). Une fois ceci fait, ajoutez dans votre répertoire <em>home</em> un fichier .vimrc contenant au moins :</p>
<div class="highlight"><pre><span></span><code>syn on
set nu
</code></pre></div>
<p>Ensuite, éditez un script shell, par exemple. Vous verrez la couleur et les numéros de ligne. Pour ceux qui comme moi on un fond noir ou sombre, on ajoutera la directive suivante à son <em>.vimrc</em> :</p>
<div class="highlight"><pre><span></span><code>set bg=dark
</code></pre></div>
<p>La coloration syntaxique s'adaptera ainsi au fond de votre terminal.</p>
<p>Et voilà ! C'est Noël sur votre shell :-)</p>
<h2>Commentaires</h2>
<h3>Le 13/12/2011 11:49 par <a href="http://daemontux.org">Zanko</a></h3>
<p>On peut avoir la couleur directement sous less avec quelques variables d’environnement, du style :
export LESS_TERMCAP_mb=$'\E[01;31m' # begin blinking
export LESS_TERMCAP_md=$'\E[01;38;5;33m' # begin bold
export LESS_TERMCAP_me=$'\E[0m' # end mode
export LESS_TERMCAP_se=$'\E[0m' # end standout-mode
export LESS_TERMCAP_so=$'\E[01;31;5;31m' # begin standout-mode - info box
export LESS_TERMCAP_ue=$'\E[0m' # end underline
export LESS_TERMCAP_us=$'\E[38;5;31m' # begin underline</p>