# 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
1

# 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 exemple HISTIGNORE=history* pour exclure la commande history mais aussi history | grep cd. A l'inverse HISTIGNORE=history exclura la commande history mais pas history | 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
1

# 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 commande history 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                   
1
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"
1

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"
1

# Utiliser 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
1
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
...
1
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
...
1
2
3

TIP

!! permet de ré-exécuter la dernière commande:

> !!
1

# 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.
Dernière mise à jour: 9/7/2021, 11:11:44 PM