Terminal, personnalisation

12 minutes
console terminal shell bash

Après avoir vu les principes et avoir pratiqué avec les commandes de bases.
On va maintenant personnaliser ce terminal.
Le rendre plus sexy et à votre image, c'est ce qu'on va voir !

Il est possible de personnaliser les couleurs et l'apparence global du terminal et de l'émulateur de terminal, de l'intégrer au bureau ou encore de le faire scroller à la façon Quake.
Bref on va voir comment le rendre plus sexy !

Il permet de modifier à lui seul plusieurs choses comme les couleurs principales, la transparence.
Sur Gnome-terminal, vous pouvez y accéder directement en cliquant sur « Édition -> Préférences du profil ».

Personnalisation du terminal sur Ubuntu

Amis gamer, il ne s'agit pas de la Playstation !
PS est l'abréviation de « prompt string ».
Ces différents prompts sont des variables d'environnement utilisées dans des situations bien définit:

  • PS1 : c'est le prompt principal que j'ai décrit dans l'article précédent. Il s'affiche à chaque commande, de la forme « utilisateur@nom_de_lhote:repertoire_courant$ ». La valeur par défaut sur les distributions Debian et ses dérivés est : « PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' »
  • PS2 : il s'agit du prompt secondaire. Sa valeur par défaut est « PS2='> ' ». Il est utilisé lors d'une demande de saisie utilisateur. Exemple :
    $ echo "chaîne de caractère pas terminée

    Appuyé sur la touche entrée et le second prompt apparaîtra pour que vous terminiez la chaîne de caractère avec un double guillemet.

  • PS3 : Ce prompt est utilisé par la commande select. Sa valeur par défaut est : « PS3='#? ' ». Exemple :
    $ select var1 in kazenojiyu.fr est un super site; do echo "la valeur courante var1 est : $var1"; done

    Lorsque le prompt s'affiche, il suffit de renseigner 1,2,3, etc... pour accéder à un élément de la liste. Pour terminer, il faut effectuer le raccourci « CTRL + C ».

  • PS4 : ce dernier prompt est utilisé pour la trace d'exécution des scripts. Pour l'activer, il suffit d'ajouter « set -x » en début de script. La valeur par défaut est « PS4='+ ' ». Par exemple :
    $ set -x;for i in kazenojiyu.fr, cest plus fort que toi;do echo $i;done;

    Les lignes précédées d'un « + » sont les traces d'exécution.

C'est chouette tout ça, mais comment on personnalise ces variables ?

Très simple, il suffit de modifier la variable, ici on s'intéressera uniquement à PS1, car c'est exactement la même chose pour PS2,PS3 et PS4, et c'est moins utile.
Pour modifier la variable le temps de la session (jusqu'à ce que l'on ferme le terminal ou l'émulateur), on utilise la commande « export ». Exemple :

$ export PS1="MON NOUVEAU PROMPT $ "

C'est très pratique pour tester les valeurs de PS1 d'autres personnes !
Pour que cela soit valable pour chaque session, il faut sauvegarder la ligne (sans le « export ») dans le fichier « .bashrc » du répertoire de l'utilisateur.
Si la ligne « PS1="..." » existe déjà, il suffit de la commenter en la précédent d'un dièse.

Et qu'est ce qu'on met dans cette variable ?

Dans cette variable, on va ajouter des caractères spéciaux (sorte de raccourcis toujours précédés d'un antislash « \ » ) pour afficher ce que l'on veut.
On peut également ajouter des commandes.
Voici une liste de caractères spéciaux :

  • \u : le nom d'utilisateur courant (exemple : « kazenojiyu »)

  • \h : affiche le nom d'hôte jusqu'au premier point "." (exemple : « kazenojiyu-Laptop » )

  • \H : affiche le nom d'hôte en entier ( exemple : « kazenojiyu-Laptop.localhost » )

  • \w : le répertoire courant ( exemple : « ~/Documents/articles/article_terminal » )

  • \W : basename du répertoire courant ( exemple : « article_terminal » )

  • \$ : « # » si l'utilisateur courant est super-utilisateur, « $ » sinon

  • \j : le nombre de processus gérés par le terminal courant ( exemple : « 0 » )

  • ! : le nombre de commande dans l'historique ( exemple : « 452 » )

  • # : le nombre de commande dans l'historique de la session courante ( exemple : « 5 » )

  • \s : le nom du shell ( exemple : « bash » )

  • \v : la version du bash ( exemple : « 4.3 » )

  • \V : numéro de version en entier : majeur.mineure.patchlevel ( exemple : « 4.3.43 » )

  • \T : l'heure au format 12h HH:MM:SS ( exemple : « 09:45:50 » )

  • \t : l'heure au format 24h HH:MM:SS ( exemple : « 21:45:50 » )

  • \@ : l'heure au format 12h am/pm HH:MM ( exemple : « 09:45 » )

  • \A : l'heure au format 24h am/pm HH:MM ( exemple : « 21:45 » )

  • \d : la date au format « jour mois date » ( exemple : « jeu. juil. 21 » )

  • \D : date au format spécifié (plus d'info sur le format : man strftime) ( exemple pour « \D{%d/%m/%Y %H:%M:%S} » : « 21/07/2016 21:43:54 »)

  • \n : saut de ligne

  • \r : retour chariot

  • \ : antislash

  • \e : caractère d'échappement ASCII, équivalent à \033 (utile pour ajouter les couleurs)

  • [ : début de chaîne contenant des caractères non imprimable

  • ] : fin de chaîne contenant des caractères non imprimable
    Avec tout ça vous avez de quoi vous amuser sur votre prompt, exemple :

    $ export PS1="\u@\h:\w>[\A]{\j}\$ "

    Si vous n'en avez pas assez, sachez qu'il est possible d'ajouter toutes les commandes possibles et imaginables :

  • afficher le résultat d'un commande : $(<commande>)

  • load average (pourcentage d'utilisation des coeurs de CPU) : $(cut -d ' ' -f 1-3 /proc/loadavg)

  • durée d'activité du système depuis le dernier boot : $(uptime | cut -d, -f1 | sed -e 's/.*up//')

  • nombre de processus en pause : $(jobs | wc -l | awk '{print $1}')

  • nombre de processus en cours d'exécution : $(ps ax | wc -l | tr -d ' ')

Et la couleur alors ?

Pour cela, il faut utiliser les caractères spéciaux \e, \[, \].
Le structure pour une couleur est : \e[<gras>;<couleur ou fond>m
Les codes couleurs utilisés comportent 2 éléments, le premier indique si le texte doit être en gras (0 ou 1) et le second le code couleur (30 à 37 sans couleur de fond et 40 à 47 avec couleur de fond).
Voici une illustration des codes couleurs :

Couleur du terminal linux ubuntu

Par exemple si l'on veut un jaune, gras, sans fond, cela donnera : « \e[1;33m », et tout ce qui suivra sera dans cette couleur.
Pour que l'utilisation de la couleur s'arrête, il faut utiliser le code suivant : « \e[0m ».

Enfin, chaque code couleur est un code nom imprimable, il faut donc l'encadrer par les caractères adéquat : \[ et \]. Cela permet de spécifier à bash que ce n'est pas des caractères imprimables, et ça évite des soucis lors du calcul de la longueur de chaîne.
Voici le prompt que j'utilise :

PS1="\[\e[1;31m\]${debian_chroot:+($debian_chroot)}\u\[\e[1;34m\]@\[\e[1;32m\]\h\[\e[1;34m\]:\[\e[1;33m\]\w\[\e[1;34m\]:\[\e[0;36m\][\j]\[\e[0m\]\$ "

Vous pouvez l'essayer avec la commande « export » :

$ export PS1="\[\e[1;31m\]${debian_chroot:+($debian_chroot)}\u\[\e[1;34m\]@\[\e[1;32m\]\h\[\e[1;34m\]:\[\e[1;33m\]\w\[\e[1;34m\]:\[\e[0;36m\][\j]\[\e[0m\]\$ "

Pour revenir à votre version vous pouvez soit fermer le terminal et le relancer, soit utiliser la commande « source » si vous avez déjà renseigné la variable PS1 :

$ source ~/.bashrc

À noter que cette partie ${debian_chroot:+($debian_chroot)} n'est utile que pour les utilisateurs de debian et ses dérivés (Ubuntu par exemple). C'est utile si vous utilisez la commande « chroot » pour savoir où vous en êtes (chroot ou non).

Pour les plus curieux, voici le script permettant d'afficher les codes couleurs :

#!/bin/bash

NC='\e[0m' # No Color

# normal
for i in {30..37}
do
    color="\e[0;${i}m" # normal
    printf " ${color}0;${i}${NC}"
done
echo

# bold
for i in {30..37}
do
    color="\e[1;${i}m" # bold
    printf " ${color}1;${i}${NC}"
done
echo

# normal with background
for i in {40..47}
do
    color="\e[0;${i}m" # normal
    printf " ${color}0;${i}${NC}"
done
echo

# bold with background
for i in {40..47}
do
    color="\e[1;${i}m" # bold
    printf " ${color}1;${i}${NC}"
done
echo

Lorsque l'on liste le contenu d'un répertoire ( commande « ls »), différentes couleurs apparaissent en fonction du type de fichier.
Il est également possible de personnaliser ces couleurs.
Pour cela, il vous faut déjà créer l'alias suivant (à placer dans le fichier ~/.bashrc) :

alias ls="ls --color"

Cela permet d'ajouter de la couleur dans la commande « ls » de base.
Ensuite on va utiliser la commande « dircolors » pour générer le fichier d'association des couleurs.

$ dircolors -p > ~/.ls_colors

Ce fichier contiens un code couleur pour un ou plusieurs types de fichiers et un ou plusieurs codes couleur pour les extensions choisies.
Vous pouvez dès à présent modifier les couleurs comme bon vous semble.
Pour cela vous pouvez vous référer aux codes couleur spécifiés plus haut, sinon le fichier rappelle les valeurs des codes en commentaire.
Vous pouvez tester vos modifications en tapant :

$ eval `dircolors ~/.ls_colors`
$ ls

Si vous êtes satisfait du résultats, il suffit d'ajouter cette commande à votre fichier ~/.bashrc :

eval `dircolors ~/.ls_colors`

Il est possible d'ajouter un logo au démarrage du terminal grâce au paquet « linuxlogo » disponible dans les dépôts Ubuntu.

Logo au démarrage du terminal linux ubuntu

Pour l'installer, rien de plus simple :

$ sudo apt-get install linuxlogo

Il y a actuellement 31 logos sympas, pour les parcourir :

$ linuxlogo -L x

Il faut bien entendu remplacer x par le numéro du logo (0, 1, 2, ..., 30).
Un fois votre logo choisi, ajoutez cette ligne à la fin de votre fichier ~/.bashrc :

linuxlogo -L 11

Il est possible d'afficher ce logo également lorsque l'on se connecte à un serveur ssh par exemple :

$ linuxlogo -a -L 30 > /etc/issue.net

Si vous modifiez les informations et que vous affichez un logo qui n'est pas celui de votre système, cela peut embêter les premiers script-kiddies qui passerons par là.
Il ne s'agit pas d'une mesure de sécurité on est bien d'accord !

Une autre possibilité super fun, c'est de pouvoir associer un terminal à son bureau.
Pour cela, un petit paquet nommé « devilspie2 » disponible dans les dépôts Ubuntu, permet de changer toutes les propriétés d'une fenêtre : la taille, la position, la décoration de la fenêtre, modifier l'opacité, et bien plus.

Update Janvier 2019 : devilspie2 n'est plus maintenu. Je vous déconseille de l'installer pour le moment. Je le laisse dans l'article au cas où quelqu'un est intéressé par le projet et souhaite le reprendre en main.

Voici un exemple :

Utilisation de devilspie2 sur Linux Ubuntu

Pour l'installer, il suffit de taper :

$ sudo apt-get install devilspie2

Ensuite, créez et éditez un fichier avec l'extension « .lua » dans le répertoire « ~/.config/devilspie2 » (par exemple « terminal.lua ») et ajoutez ça:

-- debug_print command does only print anything to stdout
-- if devilspie2 is run using the --debug option
debug_print("Window Name: " .. get_window_name());
debug_print("Application name: " .. get_application_name())

-- I want my Xfce4-terminal to the right on the second screen of my two-monitor
-- setup. (Strings are case sensitive, please note this when creating rule
-- scripts.)
if (get_window_name()=="Terminal") then
   -- x,y, xsize, ysize
   set_window_geometry(200,50,1000,600);
   stick_window();
   set_window_below();
   undecorate_window();
end

Il faut que le nom de la fenêtre de votre émulateur de terminal soit « Terminal ». J'ai testé avec xfce4-terminal et gnome-terminal et ça fonctionne. Sinon il est possible de modifier le script en fonction de votre émulateur de terminal.
Si le nom de la fenêtre est le bon, la taille et la position de la fenêtre seront modifiés.
Ensuite, la fenêtre suit le bureau courant (si vous utilisez plusieurs bureau comme moi), et elle est maintenue sous les autres fenêtres.
La dernière fonction permet d'enlever la décoration de la fenêtre, c'est a dire la barre de titre avec les boutons.
Enfin, pour voir le résultat, il suffit de lancer la commande :

$ devilspie2

Si vous voulez passer en mode debug, l'option -d vous sera utile. Cela permettra d'afficher les lignes debug_print par exemple.
Devilspie2 offre beaucoup de possibilités, c'est pourquoi je vous invite à aller voir la documentation.
Par contre à chaque redémarrage, il faudra relancer devilspie2, ce qui est assez embêtant.
Pour éviter ça, il est possible de l'ajouter au démarrage via l'utilitaire « gnome-session-properties » (pour Gnome et Unity) comme sur la copie d'écran suivante :

Lancer devilspie2 au démarrage

Chaque fenêtre « Terminal » lancée recevra alors les modifications de devilspie2.
Évidemment il est possible d'utiliser devilspie2 pour toutes les applications que nous utilisons.

Qui n'a jamais rêvé d'avoir un terminal façon Quake ?
Oui, oui, ce terminal qui descend du haut de l'écran, super pratique et très stylé !
C'est possible d'avoir le même en utilisant Guake (pour Gnome et Unity) ou Yakuake (pour KDE).

Terminal linux comme Quake (Guake)

Pour l'installer, rien de plus simple, il est disponible dans les dépôts Ubuntu :

$ sudo apt-get install guake

Pour le lancer il suffit de taper « guake » dans un terminal ou encore de le lancer avec le menu d'applications.
Il est lancé minimisé, une icône apparaît dans la systray, il suffit d'appuyer sur le raccourci « F12 » pour le dérouler.
De la même manière que pour devilspie2, pour le lancer au démarrage, on peut passer par l'utilitaire « gnome-session-properties » (pour Gnome et Unity) :

Lancer Guake au démarrage

L'icône de la systray permet d'accéder aux préférences de Guake, où l'on peut modifier l'apparence, les raccourcis clavier, et bien d'autres choses.
Pour ma part, j'utilise Guake plutôt que l'astuce avec devilspie2, car c'est plus léger, et je trouve ça plus pratique qu'une fenêtre sur le bureau.

Il est vraiment possible de personnaliser de plusieurs manières le terminal.
Je ne vous montre là que les personnalisations les plus connus.
N'hésitez pas à me faire part de vos personnalisations en commentaire, je suis très curieux !

Cet article est le dernier d'une série de 3 articles pour présenter le terminal et son utilisation. Vous pouvez consulter les autres : Terminal, les bases de l'utilisation, Terminal, c'est quoi cette bête là

http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/
https://linuxconfig.org/bash-prompt-basics
https://doc.ubuntu-fr.org/terminal

http://bashish.sourceforge.net/screenshot.html : bashish est un programme permettant d'installer des thèmes de terminal
http://www.nongnu.org/devilspie2/ : documentation de devilspie2
http://misc.flogisoft.com/bash/tip_colors_and_formatting : un peu plus de détail sur les couleurs disponibles pour le prompt

Blog Comments powered by Disqus.

Article précédent Article suivant