Fonctionnement de l'historique de Bash

Salut,

J’ai du mal à saisir comment fonctionne l’historique de bash, c’en est même agaçant parfois car je vais chercher une commande dans l’historique, ne pas la trouver, puis la retrouver plus tard pour une raison que j’ignore.

Par exemple, j’ouvre deux terminaux, je fais history, et j’ai deux historiques différents (j’ai fais la manipulation hier) :

  548  rm 1.txt 2.txt 3.txt -g
  549  rm 1.txt 2.txt 3.txt -f
  550  cat feze 
  551  rm dmesg 
  552  vim notes.txt 
  553  ps aux | grep byobu
  554  ps aux | grep tmux
  555  byobu -A -D -RR -fa -h 150000 -l -O -U
  556  byobu -D -RR -fa -h 150000 -l -O -U
  557  byobu -D -fa -h 150000 -l -O -U
  558  byobu -D -fa 150000 -l -O -U
  559  byobu -D -fa -l -O -U
  560  byobu -D -fa -l -U
  561  lslslslslslsls
  562  byobu-enable-prompt 
  563  cd
  564  cat .bashrc
  565  . .bashrc
  566  byobu-enable-prompt 
  567  source .bashrc
  568  byobu-enable-prompt 
  569  history

Et dans le deuxième :

  505  vim .bashrc
  506  source .bashrc
  507  hig r
  508  pp
  509  cd -
  510  nohup
  511  nohup nautilus
  512  nohup --help
  513  cd Bricolage/Vrac/
  514  vim Commandes_from_Deb.txt 
  515  evince 20231102_Livret_Accueil.pdf &; disown
  516  $(evince 20231102_Livret_Accueil.pdf &); disown
  517  evince 20231102_Livret_Accueil.pdf & disown
  518  exit
  519  exit
  520  tmux
  521  tmux a
  522  history

J’ai pris les dernières lignes de chaque retour à chaque fois.

Le plus rageant, c’est que quand je veux reproduire ce comportement que je n’explique pas, je n’y parviens pas x)

Est-ce que ça ne serait pas lié au fait d’ouvrir une nouvelle fenêtre ou une primo-fenêtre ? Je m’explique :

  • j’ouvre deux terminaux : /dev/pts/0 et /dev/pts/1. Ils ont logiquement chacun le même historique.
  • je lance les commandes a, b et c sur pts/0, et d, e et f sur pts/1.
  • pts/0 aura bien a, b et c dans l’historique, mais pas pts/1, et vice-versa concernant d, e et f.
  • si j’ouvre une nouvelle fenêtre (/dev/pts/2), elle ne contiendra pas a, b, c, d, e ou f.
  • par contre, si je ferme tous les terminaux et que j’en ouvre un nouveau, il contiendra bien a, b, c, d, e et f

Mais je comprends pas trop comment bash gère ça. Et je me vois mal fermer TOUS mes terminaux si par exemple j’ai lancé une commande complexe dans un terminal, que je l’ai fermé, et que pour y accéder de nouveau via l’historique il me faille fermer tous les autres terminaux…

Bonjour,

les paramètres par défaut de bash ne sont pas super pratiques de ce côté là.

Dans mon .bashrc j’ai ces quelques lignes:

shopt -s histappend
PROMPT_COMMAND="history -n; history -a"
unset HISTFILESIZE
HISTSIZE=2000

L’idée est qu’à la fin de chaque commande, celle-ci soit ajoutée au fichier d’historique .bash_history.

cf man bash, history --help

Il y a aussi plusieurs fils stackexchange sur le sujet:

Hello,

Merci pour ton retour. OK je vais tester ton astuce et parcourir les liens que tu m’as envoyé : )

salut,
juste au cas où :
dans le deuxième lien il est rappelé que les numéros de lignes peuvent changer et donc que !numero devient problématique

Hello,

Ça marche, merci pour l’info.

Re,

Bon j’ai pris le temps d’éplucher un peu le fonctionnement de l’historique. En gros les commandes sont mises en cache jusqu’à la fermeture de la session puis écrites dans .bash_history à l’ouverture d’une nouvelle session.

Mais quelques éléments m’échappent :

  • les commandes en cache, elles sont placées où ? Dans le .bash_history courant ?
  • quand on ferme notre terminal, bash fait un diff ou un cmp sur un « .bash_history général » et le .bash_history de notre homedir et ajoute les dernières lignes du ~/.bash_history au « .bash_history général ».
  • et quand on ouvre une nouvelle session, bash récupère le contenu du « .bash_history général » et le place dans le ~/.bash_history ?

Si oui, il serait où ce « .bash_history général » ?

Sinon j’ai lu le man de bash, et l’utilisation de history -n et history -a n’a rien changé…en tout cas je n’ai vu aucune différence de comportement.

Sinon il m’est arrivé un truc bizarre : plus aucune commande que je voulais récupérer n’était dans mon ~/.bash_history. Donc j’ai checké dans ~, et j’ai vu un .bash_history-06889.tmp de 2000 lignes - taille de HISTFILESIZE - qui contenait les commandes en question x) Vous sauriez ce qu’il s’est passé ?

Edit : est-ce que le cache en question ne serait pas .bash_history ? Car j’ai l’impression que faire history indique à bash de lire un autre fichier d’historique :

  • j’ai ouvert ~/.bash_history
  • j’ai modifié la deuxième ligne du fichier avec une chaine lambda.
  • quand j’ai fait « history |grep la_chaine_lambda », aucune sortie.
  • mais à l’ouverture d’une nouvelle session, j’avais bien un retour du grep en mode « 2 la_chaine_lambda ».

++