Pour une raison quelconque, je ne parviens pas à faire en sorte que mon système conserve mon historique BASH après un redémarrage. Voici les sections pertinentes de mon ~/.bashrc
:
shopt -s histappend
PROMPT_COMMAND='history -a; updateWindowTitle'
export HISTCONTROL=ignoredups
export HISTSIZE=9999
export HISTFILESIZE=999999
export HISTFILE="$HOME/.bash_history"
Pour autant que je sache, ce sont toutes les options nécessaires (je sais que je pouvais garder l'historique à travers plusieurs redémarrages sans tout cela dans le passé). Cependant, malgré avoir ajouté ces options il y a plusieurs redémarrages, je perds encore la plupart de mon historique après un redémarrage. Il n'est pas vide, mais il n'a pas les 9999 lignes que j'avais avant de redémarrer.
Avant que quiconque se plaigne, oui, j'ai lu ces questions. J'ai mis en œuvre certaines de leurs suggestions comme indiqué ci-dessus, les autres étaient soit inutiles, soit non pertinentes:
- Perte d'historique Bash lors de l'utilisation de histappend
- Comment empêcher Bash de modifier l'histoire?
- Qu'est-ce qui détermine ce qui apparaît dans la commande bash history?
- Comment puis-je conserver mon historique de bash d'une session à l'autre?
- enregistrer régulièrement l'historique bash
Au cas où il pourrait y avoir d'autres commandes pertinentes, vous pouvez voir l'intégralité de ma commande ~/.bashrc
ici .
Alors, qu'est-ce qui me manque? Pourquoi mon historique n'est-il pas sauvegardé? Si quelqu'un pense qu'un autre fichier peut être pertinent, faites le moi savoir et je le posterai. J'ai vérifié en exécutant grep -i hist \.*
mon $HOME
qui a montré que le seul .
fichier pertinent contenant la chaîne hist
ou l' HIST
était .bashrc
.
J'utilise Linux Mint Debian Edition, GNU bash, version 4.2.36 (1) -release (x86_64-pc-linux-gnu) et mon émulateur de terminal préféré (au cas où cela soit pertinent) l'est terminator
.
MISE À JOUR:
Suite à la suggestion de @ mpy dans les commentaires, j'ai changé mon ~/.bashrc
pour définir HISTFILE=~/bash_history
par opposition à la valeur par défaut ~/.bash_history
et cela semble résoudre le problème des shells interactifs . Les shells de connexion affichent toujours le même comportement, avec l'historique tronqué aux 500
lignes. Cependant, aucune HIST
variable associée n'est définie dans les fichiers concernés:
$ for f in /etc/profile ~/.profile ~/.bash_profile ~/.bash_login; do \
echo -ne "$f :"; echo `grep HIST $f`; \
done
/etc/profile :
/home/terdon/.profile :grep: /home/terdon/.profile: No such file or directory
/home/terdon/.bash_profile :grep: /home/terdon/.bash_profile: No such file or directory
/home/terdon/.bash_login :grep: /home/terdon/.bash_login: No such file or directory
$ grep -r HIST /etc/profile.d/ <-- returns nothing
Alors, pourquoi est mise HISTSIZE
et HISTFILESIZE
en ~/.bashrc
ne suffit pas à moins que je mets explicitement $HISTFILE
autre chose que la valeur par défaut ~/.bash_history
?
history
commande, la sortie que vous voyez est identique à ce que vous voyez, en cours d'exécutioncat .bash_history
, à part les numéros de ligne? Je veux dire que lahistory
commande répertorie les horodatages ou d'autres informations? La raison pour laquelle je demande, c'est que si vous voyez ces trucs ésotériques, cela signifie qu'il y a un autre module / fonction / programme, qui dérange l'historique du shell et une version incorrecte ou boguée de quoi que ce soit, pourrait vous causer du chagrin .;)
: Essayez un autre fichier en tant que HISTFILE, pas la valeur par défaut~/.bash_history
. Explication très construite: je suppose que bash est votre shell par défaut, donc au démarrage du système, un shell non interactif est le parent de votre session X (je suppose également que vous utilisez X), qui ne saura rien de l'option histappend (car .bashrc n'est que lu par des shells interactifs), donc tant que ce shell parent s'exécute, tout va bien, mais à la fin (c'est-à-dire l'arrêt du système), il remplacera~/.bash_history
(ce qui est par défaut) et gâchera votre historique ...Réponses:
Le problème se résume en fait au comportement différent des shells de connexion et de non-connexion. J'avais défini les variables qui contrôlent l'historique dans mon
~/.bahsrc
. Ce fichier n'est pas lu lorsque l'on démarre un shell de connexion, il n'est lu que par des shells interactifs non-login (deman bash
):Par conséquent, chaque fois que je me connectais, que je tombais sur un tty ou
.history
que j'utilisais ssh, le fichier était tronqué parce que je ne l'avais pas également défini à la bonne taille~/.profile
. J'ai finalement réalisé cela et j'ai simplement mis les variables à~/.profile
leur place, au lieu de~/.bashrc
Donc, la raison pour laquelle
~/.history
je devais être tronquée était parce que je n'avais défini que les variables HISTORY dans un fichier lu par des shells interactifs sans connexion et donc chaque fois que j'exécutais un type de shell différent, les variables seraient ignorées et le fichier serait coupé en conséquence.la source
.bashrc
n'est pas lu par (coquilles de connexion OU non interactives).export BASH_ENV=~/.bashrc ; if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
... et en haut du ~ / .bashrc, vérifiez que vous êtes vraiment en cours d'exécution de manière interactive:[ -z "$PS1" ] && return
... Bien sûr, c'est juste un idiome.BASH_ENV
n'est pas pertinent, il n'affecte que les shells non interactifs. Quant à «l'idiome», c'est quelque chose que Debian a commencé et avec lequel je ne suis personnellement pas d'accord. J'ai souvent des options graphiques (xset
et similaires) dans mon .bashrc et je ne veux pas que celles-ci soient actives lorsque j'exécute des shells de connexion à partir d'un tty ou viassh
. Je veux que mon .profile et .bashrc soient séparés. De nombreux gestionnaires de connexion (mais pas tous) génèrent un .profile lorsque vous vous connectez, il est donc préférable de définir les variables globales là où elles ne seront lues qu'une fois et non chaque fois que vous ouvrirez un terminal.~/.profile
ou~/.bashrc
) sont lus en dernier. Tout ce qui y est défini aura la priorité sur les paramètres globaux. Vous avez tout à fait raison, vous ne devriez pas définir ces variables/etc/bash.bashrc
. Utilisez~/.profile
(ou~/.bash_profile
) à la place.Ma suggestion est d'utiliser un autre fichier comme
HISTFILE
, pas la valeur par défaut~/.bash_history
.Bien que je n'aie aucune explication analytique, je vais essayer de décrire ce qui m'a amené à cette suggestion: si vous utilisez
bash
comme shell (de connexion) par défaut et que vous utilisez égalementX
(ce qui est très probable), vous avez unebash
instance en cours d'exécution juste après le (graphique ) s'identifier:Je pense que cette instance est un shell de connexion, donc elle ne lit pas votre
~/.bashrc
et donc ne saura rien sur l'histappend
option:Tant que ce "shell parent" s'exécute, tout va bien, mais à sa fin (c'est-à-dire l'arrêt du système), il remplacera
~/.bash_history
(car c'est la valeur par défaut) et gâche votre historique ou le clippe au démarrage du système (à nouveau par défaut) 500 lignes. (Ou peut-être les deux ...)Il me semble également qu'il ne suffit pas d'inclure la configuration de l'historique
~/.bashrc
, car cela ne devrait pas être une configuration aussi rare. Je n'ai aucune explication à cela.Concernant votre problème, que "les shells de connexion affichent toujours le même comportement", vous pouvez essayer d'inclure également la configuration de l'historique dans
~/.bash_profile
:Malheureusement, je ne peux pas poster une explication plus justifiée avec des détails de ma propre
bash
configuration, car je suis unzsh
gars ...la source
~/.bash_profile
résolu le problème. J'utilise maintenant~/.bash_history
mon fichier d'historique, mais j'ai simplement ajouté toutes les lignes de celles~/.bashrc
indiquées dans ma question à~/.bash_profile
. Vous ne savez toujours pas qui a foutu les coquilles interactives, mais cela semble fonctionner maintenant, merci!Étant donné que tous vos paramètres sont en ordre en fonction de la page de manuel et que le fichier historique n'est pas limité par la taille (octets), la seule explication possible à laquelle je peux penser. Cela a à voir avec la façon dont la coquille meurt.
Selon la référence en ligne, la sortie gracieuse (historique enregistré) se produit uniquement lorsque le shell reçoit SIGHUP. Je ne peux pas vraiment expliquer comment votre système propage les signaux lors du redémarrage, mais je soupçonne que votre shell se ferme avec SIGKILL ou SIGPWR.
Cela peut être dû au fait que votre WM s'exécute de manière asynchrone (attendez) et que l'émulateur de terminal généré à partir du WM où bash reçoit un signal de forçage de sortie autre que SIGHUP. Il se peut également que le système d'exploitation envoie rapidement le "dernier kill" à tous les processus avant que le gracieux SIGHUP initial ne parvienne à accéder au shell via X -> WM -> xterm, peut-être parce que X ou WM prend plus de temps à quitter que il faut que l'OS soit prêt à descendre.
Je suis en eaux profondes avec ce genre de choses, mais je pense que quelque chose dans ce sens provoque un comportement erratique. J'ai déjà eu ce problème, et le remède le plus solide est
exit
dans bash où vous souhaitez conserver l'historique.J'ai remarqué
history -a
dans votre question, et je ne vois pas pourquoi cela ne suffirait pas à préserver l'histoire.Vous pouvez résoudre le problème en découvrant ce qui tue vraiment votre bash et en passant à la détermination de l'origine du signal et à la résolution du problème, ou simplement vider l'historique lorsque vous savez quel signal est le dernier (en supposant que les disques sont toujours en ligne d'ici là ):
La capture d'écran incluse illustre ce dont je parle dans les deuxième et troisième paragraphes. La séquence là-bas est que je bombarde de gauche , tue la coquille gauche de droite et cat l'histoire.
homme bash
référence en ligne
capture d'écran démonstrative
la source
/tmp/pso
que tu tues? Je vois votre point sur les différents signaux de mise à mort (bien que, comme vous le dites, je pensais que c'étaithistory -a
là le problème). Je vais tester cela pendant un certain temps et faire rapport.Vérifiez / etc / profile et /etc/profile.d/*
Il y a peut-être quelque chose qui dérange les paramètres d'historique.
la source
grep -r HIST /etc/profile.d/
ne renvoie rien, et j'ai déjà vérifié/etc/profile
.