web-dev-qa-db-fra.com

Comment: Historique Bash / Shell illimité?

Existe-t-il un moyen de définir un historique illimité dans Bash?

80
Dragos

mettez cela dans .bashrc:

export HISTFILESIZE=
export HISTSIZE=

Voilà l'histoire illimitée. Actuellement, j'ai 27000 entrées :)

De "homme bash":

Si HISTFILESIZE n'est pas défini, aucune troncation n'est effectuée.

Cela signifie que .bash_history n'est jamais tronqué

La même chose semble s’appliquer à HISTSIZE, bien que je n’aie pas trouvé cela documenté.

Une autre fonctionnalité intéressante que je vais essayer est la suivante:

Si la variable HISTTIMEFORMAT est définie, les horodatages sont écrits dans le fichier historique, marqué avec le caractère de commentaire d'historique, afin qu'ils puissent être conservés au cours des sessions Shell.

Faites-moi savoir si vous avez déjà essayé cela ...

78
morgenrot

(republier ma réponse de https://stackoverflow.com/a/19533853/128597 )

Après de nombreuses itérations importantes et laides et d'étranges cas Edge au fil des ans, j'ai maintenant une section concise de mon .bashrc consacré à cela.

Tout d’abord, vous devez commenter ou supprimer cette section de votre .bashrc (valeur par défaut pour Ubuntu). Sinon, certains environnements (comme l'exécution de screen sessions) tronqueront toujours votre historique:

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

Deuxièmement, ajoutez ceci au bas de votre .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. Par conséquent, si vous collez un mot de passe par inadvertance, vous ne pouvez pas simplement "tuer -9 %%" pour éviter l'écriture de l'historique, vous devez le supprimer manuellement.

Notez également que chaque session bash charge le fichier d’historique complet en mémoire, mais même si votre fichier d’historique atteint 10 Mo (ce qui prendra un temps long , long ), vous ne remarquerez pas grand chose. d'un effet sur votre temps de démarrage bash.

41
fotinakis

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:

  1. un historique maître séparé (aucune session ne peut interrompre votre historique)

  2. écriture automatique de l'historique (pas de raccourcis clavier)

  3. écrit peu fréquent (pas d'ajout après chaque commande)

contexte

Au démarrage interactif, si $HISTFILESIZE est défini sur un nombre, bash tronque $HISTFILE avec ce nombre. A la fermeture interactive, si l'option Shell histappend est définie, bash ajoute les lignes $HISTSIZE à $HISTFILE, sinon elle remplace $HISTFILE.

astuces pour OSX (Terminal)

~/.bash_profile est lu à chaque fois qu'un onglet est créé dans Terminal, ce qui signifie que bash ne lit pas 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 vous suffit de le configurer pour utiliser un shell de connexion qui fournira vos fichiers de démarrage bash (et enregistrera votre historique).

# use bash, make it a login Shell
defshell -bash
9
cdosborn

Un concept différent (peut ne pas être applicable) mais vous pouvez avoir un historique unlimited lorsque vous utilisez Shell-sink .

3
ChristopheD