web-dev-qa-db-fra.com

parfois, les commandes d'historique ne sont pas stockées dans .bash_history

J'ai émis de nombreuses commandes hier dans mon CentOS 7. Mais quand j'ai voulu récupérer ces commandes aujourd'hui, j'ai trouvé qu'il n'y avait aucun enregistrement. Lorsque j'ai ouvert le fichier .bash_history, Je n'ai toujours pas trouvé les commandes que j'ai émises hier mais j'ai trouvé de nombreuses anciennes commandes il y a quelques jours. Pourquoi les commandes récentes n'ont-elles pas été stockées? Comment puis-je augmenter la capacité d'historique?

21
Jack

La cause la plus probable pour les éléments d'historique de ne pas apparaître n'est pas en définissant HISTFILE sur rien ou HISTSIZE sur zéro, c'est en se connectant deux fois à la même machine et en quittant avec la deuxième instance bash ( dans lequel vous avez fait peu ou rien) après celui où vous avez fait beaucoup. Par défaut, Bash ne fusionne pas les historiques et la deuxième sortie Bash écrase le .bash_history qui a été si bien mis à jour par la première sortie Bash.

Pour éviter cela, vous pouvez ajouter au fichier historique au lieu de l'écraser, vous pouvez utiliser l'option histappend Shell:

Si l'option histappend Shell est activée (voir la description de shopt sous Shell BUILTIN COMMANDS ci-dessous), les lignes sont ajoutées au fichier d'historique, sinon le fichier d'historique est écrasé.

Plus de détails dans cette réponse y compris comment utiliser HISTSIZE, HISTFILESIZE et HISTCONTROL pour contrôler la taille, les doublons, etc.

11
Anthon

Pour modifier la taille de l'historique, utilisez deux variables BASH HISTSIZE, HISTFILESIZE (généralement définies dans .bashrc).

Description de la page de manuel BASH:

HISTSIZE Le nombre de commandes à retenir dans l'historique des commandes (voir HISTORIQUE ci-dessous). Si la valeur est 0, les commandes ne sont pas enregistrées dans la liste d'historique. Les valeurs numériques inférieures à zéro entraînent l'enregistrement de chaque commande dans la liste d'historique (il n'y a pas de limite). Le shell définit la valeur par défaut à 500 après avoir lu tous les fichiers de démarrage.

HISTFILESIZE Le nombre maximum de lignes contenues dans le fichier historique. Lorsque cette variable se voit attribuer une valeur, le fichier d'historique est tronqué, si nécessaire, pour ne pas contenir plus que ce nombre de lignes en supprimant les entrées les plus anciennes. Le fichier d'historique est également tronqué à cette taille après l'avoir écrit à la fermeture d'un shell. Si la valeur est 0, le fichier d'historique est tronqué à une taille nulle. Les valeurs non numériques et les valeurs numériques inférieures à zéro empêchent la troncature. Le shell définit la valeur par défaut sur la valeur de HISTSIZE après avoir lu les fichiers de démarrage.

Par exemple, j'ai la configuration suivante dans mon .bashrc fichier:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
3
coffeMug

J'ai eu cela, mais la solution n'était pas répertoriée ici. La cause était juste un simple problème de copier-coller. Je copiais une commande d'un autre document et j'avais un espace blanc supplémentaire dans le presse-papiers. Pour une raison quelconque, cela a empêché Ubuntu de sauvegarder la commande dans le fichier historique.

enter image description here

L'image ci-dessus était la commande que j'avais dans mon presse-papiers sous forme de documents Google. Cette commande a fonctionné mais a été omise de mon historique. Je viens de revenir en arrière et j'ai sélectionné la commande sans espace, puis elle est apparue dans l'historique de bash.

1
Tycon

Vérifiez que votre variable d'environnement HISTCONTROL n'est pas définie sur ignorespace ou ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Vous pouvez le modifier en définissant la valeur dans votre ~/.bash_profile ou votre ~/.profile fichier:

HISTCONTROL=ignoredups

Depuis la page de manuel de bash:

HISTCONTROL

Une liste de valeurs séparées par deux-points contrôlant la façon dont les commandes sont enregistrées dans la liste d'historique.

Si la liste de valeurs comprend ignorespace, les lignes commençant par un caractère espace ne sont pas enregistrées dans la liste d'historique.

Une valeur de ignoredups empêche l'enregistrement des lignes correspondant à l'entrée d'historique précédente.

Une valeur de ignoreboth est un raccourci pour ignorespace et ignoredups.

Une valeur de erasedups entraîne la suppression de toutes les lignes précédentes correspondant à la ligne actuelle de la liste d'historique avant l'enregistrement de cette ligne.

Toute valeur ne figurant pas dans la liste ci-dessus est ignorée.

Si HISTCONTROL n'est pas défini ou n'inclut pas de valeur valide, toutes les lignes lues par l'analyseur Shell sont enregistrées dans la liste d'historique, sous réserve de la valeur de HISTIGNORE. La deuxième ligne et les lignes suivantes d'une commande composée à plusieurs lignes ne sont pas testées et sont ajoutées à l'historique quelle que soit la valeur de HISTCONTROL.

1
gawi