Bash history : toute une histoire

Vous utilisez souvent le shell Bash ? Alors vous devez connaître l’historique de Bash, bien sûr, c’est le fait de pouvoir remonter dans les commandes précédemment tapées. C’est vrai que c’est très pratique, ça en devient même indispensable quand on sait bien s’en servir…. mais au fait, savez-vous vous en servir ? Savez-vous ce qu’il est possible de faire au-delà du simple fait de pouvoir remonter dans l’historique avec les flèches haut et bas ?

L’une des premières commandes que l’on peut utiliser lorsqu’on veut retrouver une ligne, c’est d’essayer avec le !, qui permet de chercher la dernière ligne commençant par la même chose. Exemple :

echo Bonjour
cd ..
!echo

La dernière ligne exécutera la première.

Une deuxième manière est d’utiliser cette fois ci !? qui permet de chercher parmi toute la ligne, et pas seulement le début. Exemple pour répéter le « echo Bonjour » de tout à l’heure, on peut donc taper :

!?Bon

Attention, ces deux méthodes de recherche sont sensibles à la casse (pas dans le sens fragile, mais aux majuscules/minuscules…)

Un autre moyen pratique de relancer une commande en la modifiant est d’utiliser le remplacement, par exemple :

^Bonjou^Au revoi

Ce bout de code répètera la dernière commande exécutée en remplaçant « Bonjou » par « Au revoi », ce qui correspondra donc dans notre exemple à la commande : « echo Au revoir ».

Maintenant allons plus loin, en tapant : ctrl-r. Cette action va permettre de rechercher comme !? mais de manière interactive, c’est à dire que au fur et à mesure que vous taperez, vous verrez la commande correspondante s’afficher ! En appuyant sur Entrée vous exécuterez la commande, en appuyant sur Echap ou ctrl-j, vous pourrez la modifier avant de l’exécuter, et enfin ctrl-g ou ctrl-c vous permettra d’annuler la recherche.

C’est pas mal, c’est pas mal… mais on peut faire encore mieux !

Par exemple avec la variable d’environnement HISTIGNORE : elle permet de spécifier les commandes à ne pas mettre dans l’historique. Voici un exemple tout fait et bien fait de variable HISTIGNORE :

export HISTIGNORE="&:ls:[bf]g:exit:[ \t]*"

Si vous tapez cette commande (ou mieux, si vous la mettez dans votre /etc/profile ou ~/.bashrc), bash ignorera, dans l’ordre :

  • & : Les commandes répétées
  • ls:[bf]g:exit : les commandes ls, bg, fg et exit
  • [ \t]* : les commandes qui commencent par un espace ou une tabulation : très pratique pour ne pas mettre en historique des commandes sensibles, par exemple avec des mots de passe en clair !

De manière générale, Bash intègre plein de variables intéressantes que vous pourrez retrouver sur cette page, qui liste toutes les variables de Bash.

Un dernier moyen de personnaliser Bash et son historique est la commande shopt. Voici toutes les options de shopt. Mais les plus intéressantes à mon avis sont :

shopt -s checkjobs # Averti si des jobs sont toujours en cours d'exécution avant de quitter le shell
shopt -s cmdhist # Conserve les passages à la ligne des commandes multi-lignes
shopt -s histverify # Permet de modifier une commande rappelée avec ! ou !? avant son exécution
shopt -s cdspell ; shopt -s dirspell # Deux petites options qui corrigent les fautes de frappe automatiquement

Si vous avez d’autres astuces, n’hésitez pas à nous les faire partager dans les commentaires ci-dessous !

Inspiration et source : http://www.talug.org/events/20030709/cmdline_history.html