Comment: Bash illimité / historique du shell?

83

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

Dragos
la source

Réponses:

82

Ajoutez ceci à votre .bashrc(Linux) ou .bash_profile(MacOS):

export HISTFILESIZE=
export HISTSIZE=

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

De man bash:

Si HISTFILESIZEn'est pas défini, aucune troncature n'est effectuée.

Cela signifie .bash_historyn'est jamais tronqué

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

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

Si la HISTTIMEFORMATvariable est définie, les horodatages sont écrits dans le fichier d'historique, avec le caractère de commentaire d'historique, afin de pouvoir être conservés au cours des sessions du shell, comme suit:

export HISTTIMEFORMAT="%F %T "

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

Morgenrot
la source
3
Cela ne fonctionne pas dans de nombreux cas et l’historique bash est toujours tronqué. Voir ma réponse ci-dessous pour une solution plus complète.
fotinakis
2
Attention: cela provoque des maux de tête avec gdb; si vous définissez une HISTSIZEvariable, elle sera considérée comme un 0, désactivant ainsi totalement la taille de l'historique.
Matteo Italia
2
notes: vous n’avez pas besoin export, HISTFILESIZEc’est en nombre de lignes (pas en octets), et la troncation du fichier historique se produit lorsque vous définissez variableHISTFILESIZE (et lorsque le shell se ferme). Donc, ne le configurez pas deux fois dans votre fichier de configuration avec des valeurs différentes ...
vaab
@vaab: si je n'exporte pas HISTFILE, je ne peux pas voir ce que mon fichier d'historique utilise "echo $ HISTFILE" dans les sous-shell. Par conséquent, même si ce n'est pas nécessaire, il peut être utile et ne cause aucun dommage que je puisse détecter.
Jeff Learman
41

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

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

Tout d’abord, vous devez commenter ou supprimer cette section de votre fichier .bashrc (par défaut pour Ubuntu). Sinon, certains environnements (tels que les screensessions en cours ) 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 beaucoup de temps), vous ne remarquerez pas vraiment d’effet sur le temps de démarrage de votre bash.

fotinakis
la source
4
Le fichier d’historique est tronqué lorsque vous le définissez HISTFILESIZE. C’est pourquoi vous devez supprimer toute occurrence d’un tel événement, à l’exception de celui de votre choix. Il sera également tronqué à la sortie du shell (mais cela est prévu). Et vous ne devriez pas avoir besoin export.
vaab
3
@vaab Si vous n'exportez pas, faire quelque chose comme bash --norcva tronquer à nouveau l'historique.
Yongwei Wu
1
J'utilise export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"pour garder l'historique du shell séparé par session (basé sur le nom d'hôte et le nom de tty). Bien sûr, je dois d'abord créer le répertoire ~ / hist.
Jeff Learman
2
Notez que vous souhaiterez peut-être vérifier la valeur de PROMPT_COMMAND et ne pas l'ajouter à l'aveuglette à plusieurs reprises car cela ferait des choses folles sur votre système. Un contrôle nul ou, mieux encore, une recherche d'expansion de variable de shell est probablement plus sûre.
dragon788
3
J'utilise ceci pour éviter le problème mentionné sur @ dragon788:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg
9

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 $HISTFILESIZEest défini sur un nombre, bash est tronqué $HISTFILEsur ce nombre. À la fermeture interactive, si l'option shell histappendest définie, bash ajoute des $HISTSIZElignes $HISTFILE, sinon elle écrase $HISTFILE.

astuces pour OSX (Terminal)

Chaque fois qu'un onglet est créé dans Terminal, il ~/.bash_profileest lu, 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 qu'il utilise 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
cdosborn
la source
3

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

ChristopheD
la source