Historique de Bash illimité [fermé]

350

Je veux que mon .bash_historyfichier soit illimité. Par exemple, je peux toujours revenir en arrière et voir comment j'ai construit / configuré quelque chose, ou quelle était cette commande astucieuse, ou comment une commande a cassé quelque chose il y a des semaines. Comment modifier ce paramètre?

Francis Haart
la source
1
Bash est un langage de programmation et il ne s'agit pas de programmation?
NeilG

Réponses:

307

Définissez HISTSIZEet HISTFILESIZEdans .bashrc sur une chaîne vide:

HISTSIZE= 
HISTFILESIZE=

Dans bash 4.3 et versions ultérieures, vous pouvez également utiliser HISTSIZE=-1 HISTFILESIZE=-1:

n.  Setting HISTSIZE to a value less than zero causes the history list to be
    unlimited (setting it 0 zero disables the history list).

o.  Setting HISTFILESIZE to a value less than zero causes the history file size
    to be unlimited (setting it to 0 causes the history file to be truncated
    to zero size).
Lri
la source
12
(export PROMPT_COMMAND = 'history -a') peut vider immédiatement les commandes de bash history.
cruelcage
3
La définition HISTSIZE= HISTFILESIZE=entraîne la désactivation complète de l'historique de bash, du moins pour moi.
Philipp Ludwig
5
Le paramètre @PhilippLudwig a HISTSIZE=-1 HISTFILESIZE=-1désactivé mon historique, tout en faisant HISTSIZE= HISTFILESIZE=l'affaire. CentOS 7 ici.
Seether
1
@PhilippLudwig Je pense plutôt que HISTSIZE= HISTFILESIZE=vous ne devriezexport HISTSIZE= export HISTFILESIZE=
Matzz
3
@Seether La réponse indique clairement "Dans bash 4.3 et versions ultérieures ...". CentOS 7 a bash 4.2.x.
villapx
426

Après de nombreuses itérations grandes et laides et des cas de bord étranges au fil des ans, j'ai maintenant une section concise de mon .bashrc dédiée à 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, certains environnements (comme l'exécution de screensessions) tronqueront toujours votre historique:

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

Ensuite, ajoutez ceci au bas de votre .bashrc:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# http://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 "tuer -9 %%" pour éviter l'écriture de l'historique, vous devrez le supprimer manuellement.

Notez également que chaque session bash chargera le fichier historique complet en mémoire, mais même si votre fichier historique atteint 10 Mo (ce qui prendra très, très longtemps ), vous ne remarquerez pas beaucoup d'effet sur le temps de démarrage de bash.

fotinakis
la source
1
@AquariusPower - Essayez ce qui est exactement au-dessus, faites le HISTFILESIZE=et HISTSIZE=vide au lieu de -1, et assurez-vous que vous n'avez pas d'autres déclarations de ces paramètres dans un .bashrc ou .bash_profile ou .profile.
fotinakis
2
coupable à .bashrc, j'ai eu cette configuration après sur un autre fichier chargé par .bashrc ..., qui fonctionne maintenant! THX!
Aquarius Power
10
Ajoutez-le dans mon système bash standard, et l'ajout de l'historique actuel est également agréable, donc après la configuration, exécutezcat ~/.bash_history >>~/.bash_eternal_history
Jean-Christophe Meillaud
2
Pour conserver l'historique de l'historique, initialisez le fichier historique avec votre historique actuel.
Arthur
3
Un grand merci - le fait que le réglage HISTFILESIZE(et éventuellement HISTSIZE) prendra effet immédiatement ne peut pas être trop souligné .
Attie
37

Comme Jörg Beyer l'a mentionné ci-dessus, HISTSIZEet HISTFILESIZEsont essentiels.

En outre, vous devez absolument vérifier la variable d'environnement HISTCONTROL, qui vous permet de faire des choses intéressantes comme ne pas stocker les commandes d'historique en double ( HISTCONTROL=erasedups). Il est inutile d'avoir un historique illimité si vous devez parcourir des centaines de lignes decd .. ou similaires.

Liens: ici , et travailler avec l'historique bash . La FAQ de la variable bash vaut également la peine d'être parcourue .

simont
la source
13
Ces lignes de cd vous donnent un contexte pour les commandes émises. Ils sont en fait incroyablement utiles. Je ne comprends pas pourquoi quelqu'un voudrait les supprimer, à moins que la seule façon d'utiliser l'historique est de le parcourir une commande à la fois.
iconoclaste du
@simont J'utilise également l'option ignorespace avec HISTCONTROL, puis je l'utilise pour tout ce que je ne veux pas écrire dans l'historique, comme les mots de passe.
bigtunacan
6
Garder les lignes dans l'ordre est très utile si vous réutilisez des séquences de commandes. Par exemple, Ctrl-rcertains chars Ctrl-o Ctrl-o Ctrl-o Ctrl-o. C'est pourquoi je garde des doublons dans l'histoire.
Stéphane Gourichon
1
@ StéphaneGourichon à quoi ça sert Ctrl-o?
Ciprian Tomoiagă
4
@ CiprianTomoiagă Ctrl-oexécute la commande à l'invite et affiche immédiatement la commande juste après la précédente de l'historique. Un avantage est qu'après avoir utilisé Ctrl-rpour trouver une ancienne commande (éventuellement en utilisant les flèches haut et bas pour passer aux commandes voisines dans l'historique), il suffit de maintenir Ctrlenfoncé et d'appuyer oplusieurs fois pour exécuter à nouveau une série de commandes précédente, même en boucle infinie si tu veux. Voir aussi GNU Readline - Wikipedia
Stéphane Gourichon
22

Il existe (au moins) deux variables d'environnement pertinentes ici:

  • HISTSIZE: le nombre d'entrées dans le fichier historique
  • HISTFILESIZE: le nombre de lignes dans le fichier historique

Je pense que nous pouvons convenir que le terme illimité est souvent le même que très grand (ou avez-vous un stockage de fichiers illimité?). Il suffit donc de définir des valeurs très grandes.

Jörg Beyer
la source
23
"Il convient de noter que 1000000000 n'est égal à l'infini que pour de très petites valeurs d'infini. - sepp2k" lol. oui, je me contente de petites valeurs d'infini (disons, un mois d'utilisation fréquente du terminal).
Francis Haart
6
un mois d'utilisation fréquente du terminal est une fraction infiniment petite de l'infini. Je dirais qu'une durée de vie d'utilisation fréquente du terminal équivaut à une très très très petite valeur d'infini. Mais une vie d'utilisation fréquente du terminal est suffisante pour mon historique de shell. ;)
iconoclaste du
2
Les versions plus anciennes de zsh se bloqueront au moins si vous définissez HISTSIZE et / ou HISTFILESIZE trop grand car il essaie de pré-allouer suffisamment de mémoire. Cela est devenu pertinent lors de l'exécution d'outils utilisant zsh comme shell (dbx par exemple).
Brian Vandenberg