Où l'histoire de bash est-elle stockée?

95

Si je cours history, je peux voir mes dernières commandes exécutées.

Mais si je le fais tail -f $HISTFILEou si tail -f ~/.bash_history, ils ne sont pas répertoriés.

Le fichier est-il verrouillé, existe-t-il un emplacement temporaire ou quelque chose de similaire?

Adionditsak
la source

Réponses:

117

Bash conserve la liste des commandes en mémoire en interne pendant son exécution. Ils sont écrits en .bash_historysortie :

Lorsqu'un shell interactif se ferme, les dernières lignes $ HISTSIZE sont copiées de la liste d'historique dans le fichier nommé par $ HISTFILE.

Si vous souhaitez forcer l'écriture de l'historique des commandes, vous pouvez utiliser la history -acommande qui:

Ajoutez les nouvelles lignes d'historique (lignes d'historique entrées depuis le début de la session Bash en cours) au fichier d'historique.

Il y a aussi une -woption:

Ecrivez l'historique actuel dans le fichier d'historique.

ce qui peut vous convenir davantage en fonction de la manière dont vous utilisez votre historique.

Si vous voulez vous assurer qu'ils sont toujours écrits immédiatement, vous pouvez mettre cette commande dans votre PROMPT_COMMANDvariable:

export PROMPT_COMMAND='history -a'
Michael Homer
la source
Note latérale: si votre .bash_historyfichier devient accidentellement la propriété de root, les choses cessent de fonctionner. Dans ce cas, vérifiez la propriété et utilisez-la sudopour la réparer si nécessaire.
Torek le
13

(Pas une réponse mais je ne peux pas ajouter de commentaires)

Si vous vérifiez .bash_historyparce que vous voulez simplement supprimer une commande spécifique (par exemple, contenant un mot de passe en clair), vous pouvez directement supprimer l'entrée en mémoire par history -d <entry_id>.

Par exemple, supposons une sortie comme:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

et vous voulez purger la exportligne, vous pouvez simplement y arriver en:

history -d 928
Eddie C.
la source
11

bash le garde en mémoire de travail, bash peut être configuré pour le sauvegarder à la fermeture de bash ou après chaque commande et pour être chargé au démarrage ou à la demande de bash.

Si vous configurez pour enregistrer après chaque commande, prenez en compte les conséquences de l’exécution simultanée de plusieurs bash. (les lignes de commande seront entrelacées)

ctrl-alt-delor
la source
2
Le début de votre réponse donne l’ bashimpression que l’historique est stocké dans un fichier appelé bash, ou même dans l’ exécutable. Je voudrais écrire "Il est stocké bashdans la mémoire, ..."
Anthon
c'est en effet mieux
Anthon
5

Les commandes sont enregistrées dans la mémoire (RAM) lorsque votre session est active. Dès que vous fermez le shell, la liste de commandes est écrite .bash_historyavant l'arrêt.

Ainsi, vous ne verrez pas l'historique de la session en cours dans .bash_history.

JaySo
la source
4
Le fichier d’historique est mis à jour à la bashfin, ce qui n’implique pas un redémarrage (en particulier dans les environnements graphiques où vous pouvez ouvrir et fermer les terminaux à votre guise).
John WH Smith
4

Lors de l’exécution, l’historique est uniquement conservé en mémoire (par défaut) si:

  • set -o historique (un Hdans echo "$-") est défini.
  • HISTSIZE n'est pas 0 et
  • HISTIGNORE n’est pas *(ou un autre schéma très restrictif).

En cas d'échec de l'un des éléments ci-dessus, aucun historique n'est stocké en mémoire et, par conséquent, aucun historique ne peut ni ne sera écrit sur le disque.

L’historique en mémoire est écrit sur le disque si:

  • HISTFILESIZE n'est pas 0 et
  • HISTFILE n'est pas désactivé.

Mais seulement lorsque le shell se ferme ou si les commandes history -a(ajouter) ou history -w(écrire) sont exécutées.

Pour déclencher une écriture immédiate sur le disque, vous pouvez utiliser la variable:

 PROMPT_COMMAND='history -a'

qui sera appendles newlignes de l'historique dans le fichier d'historique. Ce sont des lignes d’historique saisies depuis le début de la session bash en cours, mais qui ne sont pas déjà ajoutées au fichier d’historique.

Ou:

 PROMPT_COMMAND='history -w'

Pour écraser l'historique dans HISTFILE avec la liste de la mémoire.

Vous pouvez donc supprimer une commande de l'historique en mémoire:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

Et écrivez-le sur le disque avec la dernière commande:

 history -w    # with `shopt -u histappend` unset
Isaac
la source
Y aurait-il un problème en mettant cela dans un travail cron? Je suppose que beaucoup d'utilisateurs avec beaucoup moins de noms d'utilisateurs se connectent à un serveur particulier et que l'historique est relativement petit et qu'il s'agit d'un serveur ancien, mais certaines sessions ne sont peut-être jamais fermées ...
oneindelijk