Pour comprendre le comportement de l'historique bash, vous devez d'abord savoir ce qui suit:
- Il y a l'historique dans le fichier historique.
- Il y a l'histoire dans la mémoire d'un processus bash.
- L'historique dans la mémoire d'un processus bash n'est pas synchronisé avec l'historique dans la mémoire d'un autre processus bash.
- L'historique dans la mémoire d'un processus bash n'est pas synchronisé avec l'historique dans le fichier, sauf demande explicite à ou pendant un événement spécifique (voir ci-dessous).
En utilisant les paramètres par défaut, le cycle de vie d'une session bash en ce qui concerne l'historique est le suivant:
- Au démarrage, bash lira le fichier historique. Le contenu du fichier d'historique est maintenant dans la mémoire du processus bash.
- Lors d'une utilisation normale, seul l'historique en mémoire est manipulé.
- Pendant l'arrêt, l'historique en mémoire est écrit dans le fichier historique, écrasant tout contenu précédent du fichier historique.
Le comportement apparemment non déterministe que vous avez observé est principalement dû au fait que le contenu du fichier historique est toujours l'historique de la dernière session bash fermée, et bash ne lit le fichier historique qu'au démarrage.
Lire le manuel bash pour une explication plus détaillée du processus de démarrage et d'arrêt.
Notez qu'avec les paramètres par défaut, je veux dire les paramètres par défaut de bash. Votre distribution a peut-être fourni un .bashrc
(ou/etc/bash.bashrc
) qui modifie ce comportement.
En activant l'option shell, histappend
vous pouvez dire à bash de s'ajouter au lieu d'écraser le fichier d'historique. Vous pouvez activer histappend
à l'aide de la commande shopt -s histappend
. Pour que cette option soit toujours activée, vous devez placer la commande dans votre .bashrc
(ou dans un autre fichier d'initialisation). En savoir plus sur la shopt
commande dans le manuel bash
Notez que l'activation histappend
ne réduira pas beaucoup le comportement apparemment non déterministe. C'est parce que chaque session bash a toujours sa propre histoire en mémoire. Il est possible d'avoir un historique bash principalement synchronisé. Il y a un guide pour que chaque processus bash ait un historique principalement synchronisé dans un thread en cas de débordement de pile .
en utilisant la commande intégrée, history
vous pouvez explicitement dire à bash de lire l'historique du fichier dans la mémoire ou l'écriture de la mémoire dans le fichier. Par exemple: history -r
va lire le contenu du fichier et l'ajouter à l'historique en mémoire. history -w
va écrire l'historique actuel de la mémoire dans un fichier, écrasant le contenu précédent. C'est essentiellement ce qui se passe lors de l'arrêt. En savoir plus sur la history
commande dans le manuel bash
Pour être complet, voici une liste des variables internes qui modifient le comportement de l'historique:
HISTFILE
: le fichier dans lequel lire et écrire l'historique.
HISTFILESIZE
: le nombre maximal de lignes pour le fichier historique.
HISTSIZE
: le nombre maximal de lignes pour l'historique en mémoire.
HISTCONTROL
, HISTIGNORE
, HISTTIMEFORMAT
: Pas pertinent pour cette discussion. Lisez le manuel bash pour plus de détails.