Existe-t-il un moyen de définir un historique illimité dans Bash ?
Réponses
Trop de publicités?Ajoutez ceci à votre .bashrc
(Linux) ou .bash_profile
(MacOS) :
export HISTFILESIZE=
export HISTSIZE=
Et voilà, une histoire sans limite. Actuellement, j'ai 27000 entrées :)
De man bash
:
Si
HISTFILESIZE
n'est pas défini, aucune troncature n'est effectuée.
Cela signifie que .bash_history
n'est jamais tronquée
La même chose semble s'appliquer à HISTSIZE
mais je n'ai pas trouvé de documentation à ce sujet.
Voici une autre fonctionnalité intéressante que je vais essayer :
Si le
HISTTIMEFORMAT
est définie, les horodatages sont écrits dans le fichier d'historique, marqués avec le caractère de commentaire d'historique, afin qu'ils puissent être préservés à travers les sessions Shell, comme suit :
export HISTTIMEFORMAT="%F %T "
Faites-moi savoir si vous avez déjà essayé...
Après de nombreuses et laides itérations et des cas limites bizarres au fil des ans, je dispose maintenant d'une section concise de mon .bashrc dédié à cela.
D'abord, vous devez commenter ou supprimer cette section de votre .bashrc (par défaut pour Ubuntu). Si vous ne le faites pas, alors certains environnements (comme l'exécution de screen
sessions) tronquera toujours votre historique :
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000
Deuxièmement, ajouter ceci au bas de votre fichier .bashrc :
# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
Remarque : chaque commande est écrite immédiatement après son exécution, donc si vous collez accidentellement un mot de passe, vous ne pouvez pas simplement "kill -9 %%" pour éviter l'écriture de l'historique, vous devrez le supprimer manuellement.
Notez également que chaque session bash chargera le fichier d'historique complet en mémoire, mais même si votre fichier d'historique atteint 10 Mo (ce qui prendra une heure et demie), vous ne pourrez pas le charger. longtemps, longtemps ) vous ne remarquerez pas beaucoup d'effet sur le temps de démarrage de votre bash.
Inclure dans ~/.bashrc :
# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=
Cette réponse répond aux critères suivants :
-
un historique principal séparé (aucune session ne peut interrompre votre historique)
-
écriture automatique de l'historique (pas de hotkeys)
-
écritures peu fréquentes (pas d'ajout après chaque commande)
arrière-plan
Au démarrage interactif, si $HISTFILESIZE
est défini comme un nombre, bash tronque $HISTFILE
à ce numéro. Lors de la fermeture interactive, si l'option Shell histappend
est défini, bash ajoute $HISTSIZE
lignes vers $HISTFILE
sinon il écrase $HISTFILE
.
conseils pour OSX (Terminal)
Chaque fois qu'un onglet est créé dans le Terminal, ~/.bash_profile
est lue, ce qui signifie que bash ne va pas continuer à lire votre ~/.bashrc
. Ajoutez la ligne suivante à votre ~/etc/bash_profile
:
# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc
conseils pour l'écran
Si vous utilisez screen, votre fichier de configuration est ~/.screenrc. Si vous voulez que screen enregistre l'historique, il suffit de le configurer pour utiliser un login Shell qui va sourcer vos fichiers de démarrage bash (et enregistrer votre historique).
# use bash, make it a login shell
defshell -bash
Un concept différent (peut ne pas être applicable) mais vous pouvez avoir unlimited
historique lors de l'utilisation de Shell-sink .