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

20

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 pu trouver 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?

Jack
la source
Parfois, lorsque le terminal est fermé anormalement, l'historique n'est pas sauvegardé, cela m'est arrivé aussi mais je ne connais pas les circonstances qui provoquent ce comportement
mazs

Réponses:

11

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

Pour éviter que cela ne se produise, vous pouvez ajouter au fichier historique au lieu de l'écraser, vous pouvez utiliser l' histappendoption shell:

Si l'option shell histappend 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, HISTFILESIZEet HISTCONTROLpour contrôler la taille, les doublons , etc.

Anthon
la source
3

Pour modifier l' utilisation de la taille de l' histoire deux variables BASH HISTSIZE, HISTFILESIZE(généralement gréée .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 .bashrcfichier:

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

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.

entrez la description de l'image ici

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.

Tycon
la source
5
L'une des options d'historique consiste à ignorer (ne pas enregistrer) les lignes commençant par un espace. Il est généralement activé par défaut. Cela peut être changé dans votre .bashrc.
studog
1

Vérifiez que votre HISTCONTROLvariable d'environnement n'est pas définie sur ignorespaceou ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Vous pouvez le modifier en définissant la valeur dans votre ~/.bash_profileou votre ~/.profilefichier:

HISTCONTROL=ignoredups

Depuis la bashpage de manuel:

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 espace ne sont pas enregistrées dans la liste d'historique.

Une valeur de ignoredupsentraîne la non-sauvegarde des lignes correspondant à l'entrée d'historique précédente.

Une valeur de ignorebothest un raccourci pour ignorespaceet ignoredups.

Une valeur de erasedupsentraî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 est non 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 multiligne ne sont pas testées et sont ajoutées à l'historique quelle que soit la valeur de HISTCONTROL.

gawi
la source