J'aime garder beaucoup d'histoire, donc je me suis histappend
installé .bashrc
. La plupart du temps, tout fonctionne bien, avec une histoire constituée de nombreux obus. Cependant, de temps en temps, je démarre un nouveau shell et je constate que j'ai perdu tout l'historique - et il ne contient souvent que certaines des commandes du dernier shell à quitter (c'est-à-dire qu'il ne s'agit pas simplement d'écraser au lieu d'ajouter) ). Pour cette raison, je soupçonne que cela se produit à la sortie du shell, plutôt que par un autre processus tuant le .bash_history
fichier. À l'appui de cette conclusion, j'ai des numéros de commande d'historique dans mon invite et je ne les ai jamais vus sauter.
Quelqu'un a déjà rencontré un problème similaire? Ou même juste des suggestions sur la façon de dépister le problème?
Réponses:
Désolé de répondre à ma propre question, mais aucune des autres réponses ne résout vraiment le problème.
J'ai finalement compris que cela ne se produit que lors de la fermeture
gnome-terminal
(fichier> exit, le bouton 'x', alt + F4), et même généralement uniquement lors de la fermeture de plusieurs terminaux en succession rapide. Cela ne se produit jamais lorsque vous utilisez ctrl-D pour fermer le shell, laissant le terminal suivre.Si je peux le définir assez bien, je déposerai un rapport de bogue sur gnome-terminal. En attendant, cela aidera peut-être d'autres personnes qui arrivent ici de Google!
la source
Je ne sais pas pourquoi cela se produit, mais vous pouvez peut-être contourner le problème en forçant bash à écrire dans son fichier d'historique chaque fois qu'il affiche une invite:
Cela écrira (-a) puis relira (-n) le fichier historique chaque fois que bash vous demandera la commande suivante. Avantage supplémentaire: vous obtiendrez la commande X dans le shell 1 dans l'histoire du shell 2.
la source
history -n
est feuilleté. C'est plus fiable à fairehistory -a; history -c; history -r
. Pour expliquer cela, je vais d'abord noter que celahistory -a
fait la bonne chose - votre.bash_history
contiendra toutes vos commandes que vous avez tapées, dans l'ordre que vous les avez tapées - en supposant que vous exécutezhistory -a
après chaque commande. Le défi consiste à synchroniser l'idée du shell sur l'historique avec le fichier .bash_history. C'est facile avec-c
et-r
, le problème est qu'il peut être lent s'il est volumineux.-n
peut casser car il identifie de manière incorrecte les lignes qui sont nouvelles. (Je suis à court d'espace ici!)-n
) Imaginez que vous exécutez une commande shell en 1:ls
. Ensuite, dans un autre shell, Shell Two, vous exécutezcd
. Maintenant, l'historique dans le .bash_history est correct à cause duhistory -a
dans votrePROMPT_COMMAND
- il contiendrals \n cd \n
. Ensuite, vous revenez à shell One et tapezpwd
. Shell One pense qu'il n'y avait que la commande n dans l'historique (ls
). Maintenant, il pense qu'il y a deux commandes (ls
etpwd
) dans l'histoire. Quand vous le faites,-n
il pense (j'ai deux commandes dans mon histoire, et il y a deux commandes dans .bash_history, donc je suis à jour.)D'après mon expérience, les shells ont mis à jour le fichier d'historique au moment de la sortie. Ainsi, "l'histoire" initiale d'un obus dépendait de la vision de l'histoire la plus récente du shell.
Le résultat de ceci est que vous pouvez obtenir des commandes qui vont et viennent à partir de l'historique, selon la façon dont les autres shells ont démarré et arrêté.
la source
histappend
. Le problème n'est pas un contenu inattendu, mais une perte totale de contenu précédemment stocké.J'ai déjà vu cela se produire auparavant, mais c'était un problème avec des erreurs de disque qui se produisaient avec une fréquence croissante. Je lancerais une analyse sur le lecteur. S'il s'avère que le lecteur est correct, je vérifierais si ce fichier ne dépasse pas une limite d'historique de shell arbitraire.
Quelque chose qui pourrait empêcher cela de se produire serait de continuer à élaguer le fichier à 80 lignes ou à autant de commandes que vous souhaitez que l'historique soit.
la source
int
bash les stocke sous.