GNU/Linux >> Tutoriels Linux >  >> Linux

Comportement étrange de l'historique bash lors de l'exécution de plusieurs sessions

Solution 1 :

Pour comprendre le comportement de l'historique bash, vous devez d'abord connaître les éléments suivants :

  1. Il y a l'historique dans le fichier historique.
  2. Il y a l'historique dans la mémoire d'un processus bash.
  3. 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.
  4. 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 :

  1. Au démarrage, bash lira le fichier d'historique. Le contenu du fichier historique est maintenant dans la mémoire du processus bash.
  2. Durant une utilisation normale, seul l'historique en mémoire est manipulé.
  3. 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.


Linux
  1. Empêcher un script bash de s'exécuter simultanément

  2. Pourquoi l'invite Bash est-elle boguée lorsque je parcours l'historique ? ?

  3. Historique de Bash :« ignoredups » et « Erasedups » Paramètre un conflit avec l'historique commun à travers les sessions ?

  4. .bash_profile n'est pas fourni lors de l'exécution de Su ?

  5. Mettre à jour l'historique de Bash sur d'autres terminaux lors de la sortie d'un terminal ?

Commande d'historique sous Linux (historique de bash)

Comment effacer l'historique de Bash sous Linux

Analyser l'historique de Bash sous Linux

Conserver l'historique de Bash dans plusieurs terminaux Windows ?

Ouverture de plusieurs onglets de terminal et exécution de la commande ?

Comment puis-je conserver mon historique bash d'une session à l'autre ?