# Historique des commandes bash
# Principes
Bash conserve les dernières commandes exécutées durant une session dans son historique des commandes. Lorsque la session se termine, cet historique des commandes est sauvegardé dans un fichier. Le contenu de ce fichier est alors soit remplacé soit complété (append) par le contenu de l'historique des commandes de la session. Le contenu du fichier est ensuite tronqué pour limiter le nombre de commandes qu'il contient. A chaque ouverture de session, ce fichier est lu pour peupler le nouvel historique des commandes de la session.
# Configuration
Plusieurs variables de shell permettent de paramétrer ce fonctionnement:
# Emplacement du fichier historique
HISTFILE
(défaut~/.bash_history
): défini le nom du fichier dans lequel l'historique des commandes est sauvegardé.
# Profondeur de l'historique
HISTSIZE
(défaut 500): défini le nombre de commandes conservées dans l'historique des commandes de la session,HISTFILESIZE
(défaut 500): défini le nombre de commandes sauvegardées dans le fichier historique.
TIP
Si l'option de shell histappend
est activée, l'historique des commandes est ajouté au fichier historique. A l'inverse,
si cet option est désactivée (fonctionnement par défaut), l'historique des commandes vient remplacer le contenu du fichier
historique à la fermeture d'une session. Pour activer cette option:
shopt -s histappend
# Contenu de l'historique
HISTIGNORE
: liste de pattern séparées par:
à ne pas ajouter dans l'historique. Il est possible d'utiliser le caractère*
, par exempleHISTIGNORE=history*
pour exclure la commandehistory
mais aussihistory | grep cd
. A l'inverseHISTIGNORE=history
exclura la commandehistory
mais pashistory | grep cd
.HISTCONTROL
: liste de flags (séparés par:
) qui filtrent les commandes ajoutées à l'historique:ignoredups
: si deux commandes identiques sont exécutées successivement, seule la première est historisée,erasedups
: supprime de l'historique des commandes toutes les commandes identiques à la dernière commande exécutée,ignorespace
: n'ajoute pas les commandes qui commencent par un espace dans l'historique des commandes,ignoreboth
: équivalent àignoredups:ignorespace
TIP
Si l'option de shell cmdhist
est activée (comportement par défaut), les commandes multi lignes sont sauvegardées comme
une seule entrée dans l'historique.
shopt -s cmdhist
# Horodatage
HISTTIMEFORMAT
: si cette variable à une valeur, alors bash conserve en plus le timestamp de chaque commande. La valeur de cette variable est utilisée par la commandehistory
pour formatter la date et l'heure de chaque commande.
# Exemple de configuration
Ces variables sont généralement définies dans le fichier .bashrc
. Par exemple, pour conserver un gros historique
de toutes les commandes saisies sans les écraser si plusieurs sessions sont ouvertes en même temps:
HISTCONTROL=erasedups
HISTSIZE=10000
HISTFILESIZE=$HISTSIZE
shopt -s histappend
2
3
4
TIP
Lorsqu'une nouvelle session est ouverte, elle n'hérite pas par défaut des commandes des autres sessions en cours
puisque leur historique n'a pas encore été enregistré dans le fichier historique (ce n'est fait qu'à la fermeture de la session).
Pour palier à ce problème, il faut ajouter chaque nouvelle commande exécutée au fichier historique,
ce qui peut se faire en modifiant la variable de shell PROMPT_COMMAND
:
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
Si l'on souhaite que les commandes exécutées dans une session soit directement accessibles dans une autre session, il faut en plus s'assurer de recharger l'historique à partir du fichier à chaque nouveau prompt:
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
# Utiliser l'historique
# Naviguer dans l'historique
A partir du prompt, il est possible de naviguer dans l'historique en utilisant les raccourcis up ou <ctrl-p> pour afficher les commandes précédente et down ou <ctrl-n> pour afficher les commandes suivantes.
Pour rechercher une commande dans l'historique, le plus simple est d'utiliser le raccourci <ctrl+r> (reverse-search-history) puis de saisir le texte recherché, bash sélectionnera alors la commande historisée la plus récente qui correspond à la recherche. Il est ensuite possible de remonter l'historique, toujours en filtrant sur le texte saisi, avec <ctrl+r>. A l'inverse, pour rechercher une commande à partir des plus anciennes, il faut utiliser <ctrl+s>.
Une autre solution consiste à utiliser la commande history
pour afficher l'ensemble de l'historique des commandes avec
leur numéro et éventuellement l'horodatage si HISTTIMEFORMAT
a été initialisé. L'historique peut ainsi être filtré par
grep
pour trouver rapidement une entrée:
> history | grep git
...
1662 git checkout master
1836 git commit -m "Add ip addr linux howto"
1838 git commit --amend
1839 git push
2
3
4
5
6
# Exécuter des commandes de l'historique
Il est possible d'exécuter une commande avec !N
où N est le numéro de la commande dans l'historique:
> !1662 # exécute git checkout master
git checkout master
...
2
3
Si l'on ne connait pas le numéro la commande !keyword
permet d'exécuter la dernière commande qui contient keyword
:
> !master # exécute git checkout master
git checkout master
...
2
3
TIP
!!
permet de ré-exécuter la dernière commande:
> !!
# La commande history
La commande history
permet d'afficher l'historique mais aussi de le modifier.
history -c
(clear): vide l'historique des commandes,history -a
(append): ajoute l'ensemble des nouvelles commandes de la session au fichier historique,history -w
(write): sauvegarde l'historique des commandes dans le fichier historique,history -r
(reload): ajoute l'ensemble des commandes du fichier historique à l'historique des commandes.