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?
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'
(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
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)
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
.
Pendant l'exécution, l'historique est conservé uniquement en mémoire (par défaut) si:
H
dans echo "$-"
) est défini.0
et*
(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:
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