Question Comment: historique Bash / shell illimité?


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


69
2018-05-04 12:01


origine




Réponses:


mettez ça dans .bashrc:

export HISTFILESIZE=
export HISTSIZE=

Voilà, histoire illimitée. 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é

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

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

Si la HISTTIMEFORMAT La variable est définie, les horodatages sont écrits dans le fichier d'historique, marqués du caractère de commentaire d'historique, de sorte qu'ils peuvent être conservés dans les sessions shell.

Faites moi savoir si vous avez déjà essayé ça ...


70
2017-07-22 09:45



Je n'avais jamais vu l'HISTTIMEFORMAT auparavant - je peux confirmer que cela fonctionne comme prévu. Vous pouvez facilement le voir fonctionner en l’ajoutant à / etc / profile (si vous voulez que tous les utilisateurs aient ceci), déconnectez-vous et reconnectez-vous, faites quelque chose comme: ls, puis history. - Snap Shot
Cela ne fonctionne pas dans de nombreux cas et l'historique de bash reste tronqué. Voir ma réponse ci-dessous pour une solution plus complète. - fotinakis
Attention: cela provoque des maux de tête avec gdb; si vous définissez un HISTSIZE variable, il prendra comme un 0, désactivant ainsi la taille de l'historique entièrement. - Matteo Italia
notes: vous n'avez pas besoin export, HISTFILESIZE est en nombre de lignes (pas d'octets) et fichier d'historique la troncature se produit lorsque vous définissez la variable  HISTFILESIZE (et quand la coque sort). Donc, ne le définissez 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 histfile utilise "echo $ HISTFILE" dans les sous-couches, donc bien que ce ne soit pas nécessaire, cela peut être utile et que je peux détecter. - Jeff Learman


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

Au fil des ans, après de nombreuses et lourdes itérations et des cas étranges, j'ai maintenant une section concise de mon .bashrc dédié à cela.

Tout 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 la course screen sessions) va encore tronquer votre histoire:

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

Seconde, Ajoute ça 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"

Note: 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 "tuer -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 long, long l'heure), vous ne remarquerez pas beaucoup d'effet sur votre temps de démarrage bash.


34
2017-10-23 06:20



Le fichier d'historique est tronqué lorsque vous définissez HISTFILESIZE, c'est pourquoi vous devez supprimer toute occurrence d'un tel événement à l'exception de celle que vous souhaitez. Il sera également tronqué à la sortie du shell (mais cela est prévu). Et vous ne devriez pas avoir besoin export. - vaab
@vaab Si vous n'exportez pas, faites quelque chose comme bash --norc va tronquer l'histoire à nouveau. - Yongwei Wu
j'utilise export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`" pour garder l'historique du shell séparé par session (en fonction du nom d'hôte et du nom tty). Bien sûr, je dois d'abord créer le répertoire ~ / hist. - Jeff Learman
Notez que vous souhaiterez peut-être vérifier la valeur de PROMPT_COMMAND et ne pas ajouter aveuglément ceci à plusieurs reprises, car cela fera des choses folles sur votre système. Une vérification nulle ou mieux encore une recherche d'expansion de variable shell est probablement plus sûre. - dragon788
@fotinakis Pourquoi tu fais export HISTFILESIZE= au lieu de HISTFILESIZE= quand il est par défaut dans .bashrc? Toutes les variables ne sont pas héritées par les sous-couches si export n'est pas mentionné? - GypsyCosmonaut


Inclus 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 séparé (aucune session ne peut interrompre votre historique)

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

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

Contexte

Au démarrage interactif, si $HISTFILESIZE est défini sur un nombre, bash tronque $HISTFILE à ce numéro. En fermeture interactive, si l'option shell histappend est fixé, bash ajoute $HISTSIZE lignes à $HISTFILE, sinon il écrase $HISTFILE.

conseils pour OSX (Terminal)

Chaque fois qu'un onglet est créé dans Terminal, ~/.bash_profile est lu, ce qui signifie que bash ne continue pas à 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 souhaitez que l'écran enregistre l'historique, il vous suffit de le configurer pour utiliser un shell de connexion qui va générer vos fichiers de démarrage bash (et enregistrer votre historique).

# use bash, make it a login shell
defshell -bash

7
2018-03-22 19:47





Un concept différent (peut ne pas être applicable) mais vous pouvez avoir unlimited historique lors de l'utilisation évier.


3
2018-05-04 12:35