Console

Personnaliser le shell bash : alias, historique, prompt

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

bash-logo



Introduction



Le shell (bash ou autre) est personnalisable via un fichier de configuration.

Pour BASH, il s'agit du fichier .bashrc. Il se situe dans le dossier ~/.bashrc. Il est lu à chaque exécution du shell.

S'il n'est pas lu, vérifier la présence du fichier de profile .bash_profile qui doit appeler .bashrc:

Code BASH :
# if running bash
if [ -n "$BASH_VERSION" ]
then
    # include .bashrc if it exists
    if [ -f "~/.bashrc" ]
    then
        . "~/.bashrc"
    fi
fi
 


On pourra ajouter dans ce fichier des alias, des fonctions, des modifications du prompt.

Après modification du fichier ~/.bashrc, pour le prendre en compte :
Code BASH :
source ~/.bashrc


Les alias



En Bash, un alias peut être considéré comme une sorte de raccourci de ligne de commande, qu'il s'agisse d'une commande ou une séquence de commandes plus longue.

Ils peuvent nous être utile surtout sur des commandes qu'on va fréquemment exécuter pour en simplifier l'utilisation.

Si un alias porte le même nom qu'une commande système, l'alias sera prioritaire par rapport à la commande.

Pour lister les alias créés sur le système :
Code BASH :
alias


Il est possible de créer un alias comme ceci :
Code BASH :
alias monalias="commandes"


Par exemple :
Code BASH :
alias maj="sudo dnf upgrade"


Ainsi, en invoquant l'alias maj, appelé comme une commande classique (l'auto-complétion fonctionne), le shell exécutera la commande sudo dnf upgrade.

Après avoir défini un alias, il est possible de supprimer un alias avec la commande unalias :
Code BASH :
unalias monalias


Exemple pour supprimer l'alias maj :
Code BASH :
unalias maj


Les alias créés comme ceci ne sont pas créés de manière permanente, mais uniquement pour la session en cours.

Pour rendre permanent les alias, il suffit simplement de les ajouter dans le fichier ~/.bashrc


Dans le cas où un alias porte le même nom qu'une commande sur votre système, on peut appeler la commande originale en faisant précéder celle-ci d'un anti-slash.

Sur beaucoup de systèmes, vous aurez ce type d'alias :
Code BASH :
alias grep='grep --color=auto'


Ici, un alias grep appelle la commande grep avec l'option color. Cela permet d'avoir la coloration par défaut en invoquant la commande grep.

Si on souhaite utiliser grep la commande et non l'alias, voici un exemple d'utilisation :
Code BASH :
\grep NAME /etc/os-release



Personnalisation de l'historique



Il existe des variables spécifiques qui permettent de personnaliser le comportement de la commande history.

Par défaut la commande history affiche le numéro de la commande et la commande saisie, dans une limite de 500 ou 1000 entrées.

Exemple :
Code BASH :
  997  less /etc/sudoers
  998  less /etc/group
  999  exit
 1000  history


On a la variable HISTTIMEFORMAT qui permet de définir une date et heure d'exécution de chacune des commandes dans l'historique (n'est pas rétroactif) :

Code BASH :
HISTTIMEFORMAT="%F %T "


Notons le résultat si on invoque :

Code BASH :
 1002  2024-01-18 18:52:21 ls
 1003  2024-01-18 18:52:29 cd /var/tmp
 1004  2024-01-18 18:52:31 ls
 1005  2024-01-18 18:52:35 systemctl status sshd
 1006  2024-01-18 18:52:39 history


On a la variable HISTSIZE qui permet de définir le nombre de commandes présentes dans l'historique. Pour augmenter l'historique à 5000 entrées :
Code BASH :
HISTSIZE=5000


Ces variables sont à positionner dans le fichier ~/.bashrc pour que le paramétrage souhaité soit persistant.

Il existe beaucoup d'autres variables permettant de modifier le comportement de l'historique dans bash.

Pour plus d'infos, chercher HIST dans la page de manuel de bash :
Code BASH :
man bash



Personnalisation du prompt



Le prompt est personnalisable directement dans le fichier .bashrc.
La définition de l'affichage du prompt est définie par la variable $PS1.

Si la variable du prompt se note $PS1, notez qu'il existe d'autres variables telles que :
- $PS0 qui s'affiche après la saisie d'une commande mais avant la sortie de cette commande
- $PS2 qui est le second prompt (quand il y a une commande multilignes par exemple)


Le prompt par défaut est souvent défini par cette forme :
Code BASH :
[\u@\h \W]\$


On remarquera qu'il y a des symboles spéciaux échappés par le caractère backslash.
Voici un petit tableau récapitulatif des caractères utilisables :
Code BASH :
\u
Nom d'utilisateur actuel
Code BASH :
\$
Indique le statut : $ pour utilisateur et # pour root
Code BASH :
\h
Nom d'hôte court
Code BASH :
\H
Nom d'hôte complet
Code BASH :
\w
Chemin complet du répertoire de travail
Code BASH :
\W
Nom du répertoire de travail sans le chemin
Code BASH :
\d
Date au format Joursemaine Mois Jour
Code BASH :
\t
Heure au format 24h hh:mm:ss
Code BASH :
\T
Heure au format 12h hh:mm:ss
Code BASH :
\@
Heure au format 12h avec AM/PM
Code BASH :
\#
Numéro de commande dans la session
Code BASH :
\!
Numéro de commande dans l'historique
Code BASH :
\n
Nouvelle ligne
Code BASH :
\e
Echappement


On peut en plus ajouter des couleurs avec les codes suivant spéciaux :
Code BASH :
\[\e[32m\]
Début de couleur verte
Code BASH :
\[\e[31m\]
Début de couleur rouge
Code BASH :
]\[\e[44m\]
Début surligné bleu
Code BASH :
]\[\e[01m\]
Début de caractères en gras
Code BASH :
]\[\e[1;31m\]
Début de caractères en gras et rouge
Code BASH :
\[\e[1;32;44m\]
Début de gras, en vert surligné en bleu
Code BASH :
\[\e[0m\]
Fin de la couleur


On prendra garde d'échapper les crochets ouvrants et fermants pour éviter des problèmes d'affichage.
Pour les couleurs, notons : 30m noir, 31m rouge, 32m vert, 33m jaune, 34m bleu, 35m magenta, 36m cyan, 37m blanc
Pour les fonds, notons : 40m noir, 41m rouge, 42m vert, 43m jaune, 44m bleu, 45m magenta, 46m cyan, 47m blanc
Pour le style de texte : 1m gras, 3m italique, 4m souligné
Pour combiner les styles, les séparer par un point virgule : 1;32;44m (gras + vert + fond bleu)

Voici quelques exemples.

Afficher l'utilisateur, l'hôte et le répertoire :
Code BASH :
PS1='\u@\h:\w\$ '


Ajouter une couleur verte au prompt (la commande est en couleur normale après) :
Code BASH :
PS1='\[\e[32m\]\u@\h:\w\$\[\e[0m\] '


Afficher un symbole dans le prompt :
Code BASH :
PS1='\u@\h \w ➜ '


Afficher un état du code retour en couleur de la dernière commande :
Code BASH :
PS1='\u@\h:\w \[$(if [ $? -eq 0 ]; then echo "\[\e[32m\]✔"; else echo "\[\e[31m\]✘"; fi)\] \$ \[\e[0m\]'


On peut tester à la volée le prompt en redéfinissant la variable PS1.
Si on souhaite garder les modifications, on complètera le fichier .bashrc avec notre nouvelle variable PS1.


Il existe de nombreux projets en ligne proposant des collections de scripts rendant le prompt joli et lui ajoutant des fonctionalités tels que :
- powerline : https://github.com/powerline/powerline
- ohmybash : https://github.com/ohmybash/oh-my-bash
Cependant, à titre personnel, je pense que ces collections de scripts peuvent causer plus de problèmes que d'être utiles.


Charger des scripts personnalisés



Le répertoire /etc/profile.d est utilisé pour stocker des scripts shell qui sont exécutés automatiquement lorsqu'un utilisateur se connecte à un système Linux.
Ces scripts sont généralement utilisés pour définir des variables d'environnement, des configurations ou effectuer d'autres tâches liées à l'initialisation de l'environnement utilisateur.
On peut sans soucis déposer des scripts perso dedans.
Pour qu'ils soient invoqués, ces scripts n'ont pas l'obligation d'être exécutables, cependant ils doivent porter l'extension .sh

A noter que dans tous les cas, les modifications dans le fichier ~/.bashrc resteront prioritaires sur les scripts.

Par exemple, pour créer un prompt simple, vert en tant qu'utilisateur classique et rouge pour le super utilisateur, on pourrait créer le script suivant :

Code BASH :
vi /etc/profile.d/colorprompt.sh


Un simple test sur le UID permet d'afficher en rouge si on est root (UID=0) et sinon en vert :

Code BASH :
if [[ "$UID" -eq "0" ]]
then
    PS1="\[\e[01;31m\]\u@\h\[\e[01;34m\] \w \$\[\e[00m\] "
else
    PS1="\[\e[01;32m\]\u@\h\[\e[01;34m\] \w \$\[\e[00m\] "
fi