Le ls en couleur

Thorbjoern Ravn Andersen (ravn@imada.ou.dk)
version française : Pierre Vassellerie (Pierre.Vassellerie@obspm.fr)

v1.0f2, 14 Octobre 1995
La commande ls livrée dans la distribution Slackware de Linux permet un affichage en couleur (Slackware 2.0.2 et noyau 1.1.54 de Linux. Ceci marche aussi bien avec agetty, qu'avec mgetty_ps). Il se peut que les couleurs par défaut ne vous plaisent pas et que vous prenne l'envie de les trifouiller. Ce document a pour unique but de vous expliquer le principe de fonctionnement et la configuration des couleurs utilisés par cette commande.

1. Comment sélectionner les couleurs ?

Il existe deux méthodes :

  1. Première méthode : utiliser le programme setterm qui s'avère parfait pour une modification rapide et simple de la configuration par défaut. Les manuels et aides de cette commande sont relativement énigmatiques et je ne tenterais en aucune manière de vous les rendre plus clairs ;-). Les sélections sont réalisées par :
            setterm -foreground black -background white -store
    
    -store signifie que cette configuration est à enregistrer comme configuration par défaut pour la console courante. Il vous faudra recommencer cette opération pour chaque nouvelle console virtuelle, et il semble alors une excellente idée de placer cette ligne dans votre .login (en csh ou tcsh) ou votre .profile (en sh, ksh ou bash). Vous en connaissez désormais autant que moi sur la commande setterm :-).
  2. Deuxième méthode : Linux utilise les codes d'échappement ANSI du style
      ESC [  m
    
    ESC est le caractère ASCII 27 et paramètres est aucun ou plusieurs nombres séparés par des points-virgules. Par exemple :
      "\033[41;33;1m" qui donne un affichage jaune sur fond rouge
      "\033[30;47m"   qui donne un affichage blanc sur fond noir
      "\033[m"        qui retablit l'affichage par defaut
    

Ces exemples nécessitent un shell reconnaissant les constructions du type \xxx. Si ce n'est pas le cas, insérez directement un caractère d'échappement directement dans la chaîne. Sous bash/vi tapez Ctrl-V ESC, et sous tcsh/emacs tapez Ctrl-Q ESC.

2. Quelles combinaisons de couleurs sont possibles ?

Ceci est un script en C-shell faisant apparaître sur la console l'ensemble des combinaisons de couleurs :


#!/bin/csh
#
# Affiche les couleurs ANSI
#
set esc="\033["
foreach fore (30 31 32 33 34 35 36 37)
  set line1="$fore  " line2="    " 
  foreach back (40 41 42 43 44 45 46 47)
    set line1="${line1}${esc}${back};${fore}m Normal  ${esc}0m"
    set line2="${line2}${esc}${back};${fore};1m ${back} Bold ${esc}0m"
  end
  echo "$line1\n$line2"
end

Le numéro de la couleur d'avant-plan est croissant vers la gauche, et le numéro de la couleur d'arrière-plan est donné dans le pavé. Si vous désirez un affichage en gras, ajoutez un 01 comme premier paramètre. Mettez un point-virgule entre chaque paramètre, et mettez l'ensemble de la séquence comme paramètres.

3. Affichage par type de fichiers

La commande ls commence par regarder la définition des associations de couleurs dans le fichier ~/.dir_colors et s'il n'existe pas utilise le fichier /etc/DIR_COLORS. Ces fichiers contiennent des entrées du style :

    LINK 36;1           # lien symbolique
    FIFO 40;33          # tube
    SOCK 41;01;35       # socket
    BLK 41;33;01        # gestionnaire en mode bloc
    CHR 41;33;01        # gestionnaire en mode caractere

    EXEC 32;1           # fichier avec droit d'execution

    .tar 01;31          # archives et fichiers compressés
    .tgz 01;31
    .zip 01;31
    .z   01;31
    .Z   01;31
    .gz  01;31

les séquences ANSI données en paramètres sont ici données exactement avec la même syntaxe que pour la commande setterm. Modifiez ceci à votre guise, et voyez le résultat d'un ls sur /sbin, /etc et /dev.

Afin que le fichier /etc/DIR_COLORS ou ~/.dir_colors soit pris en compte, il vous faut rajouter dans /etc/profile ou ~/.profile (sh/bash) ou /etc/csh.login ou ~/.login (csh/tcsh) la ligne :

 eval `/bin/dircolors`
ATTENTION : cette ligne doit être placée avant une quelconque définition d'alias pour ls. Cette commande lit le fichier /etc/DIR_COLORS ou ~/.dir_colors et fournit les variables d'environnement LS_COLORS et LS_OPTIONS ainsi que les alias ls, dir, vdir, d et v.

4. Comment donner une configuration par défaut

Ceci est réalisé individuellement pour chaque console virtuelle à l'aide de la séquence ANSI :

Cette information a été trouvée en parcourant le source du noyau. Je ne peux donc dire s'il s'agit d'un standard.
        ESC [ 8 ]
qui spécifie les valeurs par défaut des couleurs d'avant et arrière-plan. La séquence ANSI de recomposition des attributs (ESC [ m) permet alors de prendre en compte ces couleurs plutôt que du blanc sur fond noir.

La méthode décrite ici est supposée être pour des systèmes "isolés", dans le sens où les logins ne se font que sur la console. Ceci ne marche pas forcément pour des logins se faisant depuis des terminaux distants, des connexions par modem ou d'autres machines, qui dans ce cas ne comprendrait pas les séquences. L'interprétation des codes ANSI est une propriété des consoles Linux et n'existe que dans peu d'autres programmes de terminal.

Si vous êtes sur un système "isolé", un bon moyen de faire prendre en compte les couleurs pour chaque console est de modifier le fichier /etc/issue, et d'en voir le résultat en se délogeant. Généralement (et en particulier dans les distributions Slackware) ce fichier est lu et affiché à chaque reboot. Ainsi si votre /etc/rc.d/rc.S contient (aux environs de la ligne 75) :

  # Initialise /etc/issue et /etc/motd pour qu'il donne la version du noyau utilise
  # ATTENTION : les fichiers /ETC/ISSUE AND /ETC/MOTD sont crees à chaque boot.
  # Mettez ceci en commentaire si vous desirez personnaliser une bonne fois pour
  # toute ces fichiers.
  echo ""> /etc/issue
  echo Bienvenue dans le monde merveilleux de Linux \
       `/bin/uname -a | /bin/cut -d\  -f3`. >> /etc/issue
  echo >> /etc/issue

Mettez ces lignes en commentaire ou modifiez comme suit :

...
  # Mettez ceci en commentaire si vous desirez personnaliser une bonne fois pour
  # toute ces fichiers
  ESCAPE=""
  echo "${ESCAPE}[H${ESCAPE}[37;44m${ESCAPE}[8]${ESCAPE}[2J"> /etc/issue
...

Mon shell de démarrage ne comprend pas le \033, je dois alors spécifier le code ASCII 27 dans mon script comme indiqué dans le premier paragraphe. La ligne ressemble alors à ESCAPE="^[".

Ce code a pour effet de ramener le curseur en début de fenêtre, changer les couleurs, sauver la sélection et effacer l'écran. Cette modification n'aura un effet qu'au prochain reboot.

Si votre "boîte Linux" n'est pas "isolée", il se peut que certains problèmes apparaissent lors des connexions des utilisateurs distants. Ceci est dû au fait que leur terminal ne comprend pas les séquences d'échappement ANSI.

Vous devez alors ajouter au niveau de l'utilisateur :


.profile (sh/bash) :
  if [ "$TERM" = "console" ]; then
      echo "\033[37;44m\033[8]"
  fi

ou

.login (csh/tcsh) :
  if ( "$TERM" == "console" ) then
    echo "\033[37;44m\033[8]"
  endif

Si l'on désire que la modification se fasse pour tous les utilisateurs du système, il suffit alors que root modifie les fichiers /etc/profile ou /etc/csh.login. (Je rappelle une dernière fois que si le shell ne peut interpréter les \0xx (en particulier l'échappement \033), il suffit de remplacer ce dernier par "ESC".

5. Commentaires et critiques

L'auteur original de ce document nous dit :

  This is still a rough draft, and English isn't my primary language.
Please feel free to correct me on the above text in order to make it as
clear and correct as possible.  This goes, of course, for the information
provided as well.

Comments and criticism goes to 
--
  Thorbjo/rn Ravn Andersen              "...and...Tubular Bells!"
  ravn@imada.ou.dk          
  

et je suis bien d'accord avec lui. Pour la version française, n'hésitez pas une seconde à m'envoyer vos remarques, corrections, ajouts, bouteilles de vin, etc...

6. Copyright

Cette version est placé sous copyright (c)1995 de Pierre Vassellerie.

Comme tous les documents HOWTO, ce document peut être reproduit et distribué dans son intégralité ou partiellement, par quelque moyen physique que ce soit. Il reste malgré tout sujet aux conditions suivantes :

Des exceptions à ces règles peuvent être accordées dans des buts éducatifs, écrivez à l'auteur et demandez. Ces restrictions ont pour but unique de protéger les auteurs et leur travail. Toute aide éducative de ce document sera grandement appréciée.