web-dev-qa-db-fra.com

Où est stocké l'historique de bash?

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

Mais si je le fais tail -f $HISTFILE ou 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?

106
Adionditsak

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

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 le history -a , 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 -w option:

Écrivez l'historique actuel dans le fichier historique.

qui peut vous convenir davantage en fonction de la façon exacte 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_COMMAND variable:

export Prompt_COMMAND='history -a'
132
Michael Homer

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

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

Par exemple, en supposant une sortie comme:

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

et vous voulez purger la ligne export, vous pouvez simplement y parvenir en:

history -d 928
14
Eddie C.

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

Si vous configurez pour enregistrer après chaque commande, envisagez les implications de l'exécution simultanée de plusieurs bash. (les lignes de commande seront entrelacées)

11
ctrl-alt-delor

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

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

5
JaySo

Pendant l'exécution, l'historique est conservé uniquement en mémoire (par défaut) si:

  • définir -o historique (un H dans echo "$-") est défini.
  • HISTSIZE n'est pas 0et
  • HISTIGNORE n'est pas * (ou un autre modèle très restrictif).

Si l'un des problèmes ci-dessus échoue, aucun historique n'est stocké en mémoire et, par conséquent, aucun historique n'a pu ou 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 uniquement lorsque le shell se ferme ou si les commandes history -a (ajouter) ou history -w (écriture) sont exécutées.

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

 Prompt_COMMAND='history -a'

qui append les lignes d'historique new vers le fichier d'historique. Ce sont des lignes d'historique entrées depuis le début de la session bash en cours, mais pas déjà ajoutées au fichier d'historique.

Ou:

 Prompt_COMMAND='history -w'

Pour écraser l'historique dans le 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
5
Isaac