Solution 1 :
Pour comprendre le comportement de l'historique bash, vous devez d'abord connaître les éléments suivants :
- Il y a l'historique dans le fichier historique.
- Il y a l'historique 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 de tout 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 lors d'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 d'historique. Le contenu du fichier historique est maintenant dans la mémoire du processus bash.
- Durant 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 d'historique, écrasant tout contenu précédent du fichier d'historique.
Le comportement apparemment non déterministe que vous avez observé est principalement dû au fait que le contenu du fichier d'historique est toujours l'historique de la dernière session bash fermée et que bash ne lit le fichier d'historique qu'au démarrage.
Lisez 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 modifient ce comportement.
En activant l'option shell histappend
vous pouvez dire à bash d'ajouter au lieu d'écraser le fichier d'historique. Vous pouvez activer histappend
en utilisant la commande shopt -s histappend
. Pour que cette option soit toujours activée, vous devez mettre la commande dans votre .bashrc
(ou autre fichier d'initialisation). En savoir plus sur le shopt
commande dans le manuel bash
Notez que l'activation de histappend
ne réduira pas beaucoup le comportement apparemment non déterministe. C'est parce que chaque session bash a toujours son propre historique en mémoire. Il est possible d'avoir un historique de bash principalement synchronisé. Il existe un guide expliquant comment faire en sorte 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 dire explicitement à bash de lire l'historique du fichier vers la mémoire ou d'écrire de la mémoire vers le fichier. Par exemple :history -r
lira le contenu du fichier et l'ajoutera à l'historique en mémoire. history -w
écrira l'historique actuel de la mémoire vers le fichier, en écrasant le contenu précédent. C'est essentiellement ce qui se passe pendant l'arrêt. En savoir plus sur le 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 à lire et à écrire l'historique.HISTFILESIZE
:le nombre maximal de lignes pour le fichier d'historique.HISTSIZE
:le nombre maximum 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.
Solution 2 :
http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively
Vous pourrez peut-être manipuler la façon dont le fichier d'historique est écrit avec l'un des terminaux, c'est-à-dire exécuter "history -a" ou "history -w" dans le terminal dont vous souhaitez enregistrer l'historique, puis "history -r" dans les autres terminaux. Cela dépend de ce que vous voulez faire.