Améliorer la gestion de l'historique de Bash🔗

Posted by Médéric Ribreux 🗓 In blog/ Sysadmin/

#shell #system #sysadmin

Introduction

Ça fait des années que j'utilise Bash comme shell. Il n'est pas parfait, mais avec le temps, je m'y suis habitué. Je l'ai peu à peu configuré pour qu'il corresponde à mon besoin. Dernièrement, je me suis retrouvé en perte de commande. En effet, j'avais pris soin d'élaborer un appel compliqué avec de nombreux arguments à une commande. Je croyais bêtement que j'allais la retrouver dans l'historique. Mais, cela faisait trop longtemps que je l'avais saisie.

Pour remédier à ça, je me suis dit qu'il était temps d'améliorer ce point et c'est l'objet de ce court article.

Configuration

Voilà la configuration que j'ai ajoutée. Globalement, je configure l'historique de Bash pour enregistrer une quantité quasi infinie de commandes. En plus, je formatte l'historique pour garder trace des timestamps du lancement des commandes. Ça me permet de savoir quand j'ai lancé la commande et c'est parfois utile. Enfin, pour ne pas trop encombrer l'historique de commandes inutiles, j'indique des commandes à ne pas enregistrer (le ls sans argument et l'appel à la doc).

# History configuration
## Ignore duplicate and space starting stuff
HISTCONTROL=ignoreboth
HISTSIZE=100000
HISTFILESIZE=200000
HISTIGNORE="ls:man*:history"
## Display timestamps for history
HISTTIMEFORMAT="%F %T  "
## Append to the history file, don't overwrite it
shopt -s histappend
## Use fzf for search stuff
if command -v "fzf" &> /dev/null
then
    source /usr/share/doc/fzf/examples/key-bindings.bash
fi

Bonus: améliorer le visuel de la recherche

La recherche de Bash, avec Ctrl-R reste assez basique. J'aurais bien aimé avoir la liste complète de ce qui s'approche de ce que je recherche. Pour ça, il faut un programme qui affiche la liste. J'ai trouvé l'outil fzf qui fait ça. Il est codé en Rust et il est disponible dans Debian stable (bookworm).

apt install fzf

Le paquet fzf vient avec une configuration pour bash que vous pouvez activer comme je l'ai fait dans .bashrc au dessus. Ainsi, un simple Ctrl-R appelle fzf et permet d'afficher une liste fonctionnelle qu'on peut parcourir avec les flèches du clavier. Simple, mais efficace.

fzf est codé en Rust, mais ce qui est bien, c'est qu'il est livré sous forme de binaire statique, ce qui évite d'installer toute la bibliothèque standard Rust (qui peut être volumineuse) ainsi que ses nombreuses dépendances. Le binaire est certes assez gros, mais ça reste raisonnable.