Unbegrenzte Bash-Historie [geschlossen]

350

Ich möchte, dass meine .bash_historyDatei unbegrenzt ist. zB So kann ich immer zurückgehen und sehen, wie ich etwas erstellt / konfiguriert habe, was dieser raffinierte Befehl war oder wie ein Befehl vor Wochen etwas kaputt gemacht hat. Wie ändere ich diese Einstellung?

Francis Haart
quelle
1
Bash ist eine Programmiersprache und es geht nicht um Programmierung?
NeilG

Antworten:

307

Setzen Sie HISTSIZEund HISTFILESIZEin .bashrc auf eine leere Zeichenfolge:

HISTSIZE= 
HISTFILESIZE=

In Bash 4.3 und höher können Sie auch Folgendes verwenden 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
quelle
12
(export PROMPT_COMMAND = 'history -a') kann Befehle sofort in den Bash-Verlauf leeren.
Cruelcage
3
Das Einstellen HISTSIZE= HISTFILESIZE=führt dazu, dass der Bash-Verlauf zumindest für mich vollständig deaktiviert wird.
Philipp Ludwig
5
Die Einstellung @PhilippLudwig hat HISTSIZE=-1 HISTFILESIZE=-1meinen Verlauf deaktiviert, während HISTSIZE= HISTFILESIZE=der Trick ausgeführt wurde. CentOS 7 hier.
Seether
1
@PhilippLudwig Ich denke eher als HISTSIZE= HISTFILESIZE=Sie solltenexport HISTSIZE= export HISTFILESIZE=
Matzz
3
@Seether Die Antwort lautet eindeutig "In Bash 4.3 und höher ...". CentOS 7 hat Bash 4.2.x.
Villapx
426

Nach vielen großen, hässlichen Iterationen und seltsamen Randfällen im Laufe der Jahre habe ich jetzt einen kurzen Abschnitt meiner .bashrc , der sich diesem Thema widmet.

Zuerst müssen Sie diesen Abschnitt Ihrer .bashrc auskommentieren oder entfernen (Standard für Ubuntu). Wenn Sie dies nicht tun, screenwird Ihr Verlauf in bestimmten Umgebungen (z. B. beim Ausführen von Sitzungen) weiterhin abgeschnitten:

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

Zweitens fügen Sie dies am Ende Ihrer .bashrc hinzu:

# 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"

Hinweis: Jeder Befehl wird unmittelbar nach seiner Ausführung geschrieben. Wenn Sie also versehentlich ein Kennwort einfügen, können Sie nicht einfach "-9 %%" töten, um das Schreiben des Verlaufs zu vermeiden. Sie müssen es manuell entfernen.

Beachten Sie auch, dass bei jeder Bash-Sitzung die gesamte Verlaufsdatei in den Speicher geladen wird. Selbst wenn Ihre Verlaufsdatei auf 10 MB anwächst (was sehr lange dauert ), werden Sie keine großen Auswirkungen auf die Startzeit Ihrer Bash bemerken.

fotinakis
quelle
1
@AquariusPower - Versuchen Sie, was genau oben steht, machen Sie das HISTFILESIZE=und HISTSIZE=leer anstelle von -1 und stellen Sie sicher, dass Sie keine anderen Deklarationen dieser Parameter in einem .bashrc- oder .bash_profile oder .profile haben.
fotinakis
2
Schuld daran war .bashrc, dass ich dieses Setup nach einer anderen Datei hatte, die von .bashrc geladen wurde ... und jetzt funktioniert! Danke!
Aquarius Power
10
Fügen Sie es in meinem Standard - Bash - System und aktuelle Geschichte Zugabe ist auch schön, so nach dem Config, läuftcat ~/.bash_history >>~/.bash_eternal_history
Jean-Christophe Meillaud
2
Initialisieren Sie die Verlaufsdatei mit Ihrem aktuellen Verlauf, um den Verlaufsverlauf beizubehalten.
Arthur
3
Vielen Dank - die Tatsache, dass die Einstellung HISTFILESIZE(und möglicherweise HISTSIZE) sofort wirksam wird, kann nicht überbetont werden .
Attie
37

Wie Jörg Beyer oben erwähnt hat HISTSIZEund der HISTFILESIZESchlüssel ist.

Darüber hinaus sollten Sie auf jeden Fall die Umgebungsvariable überprüfen, mit der HISTCONTROLSie coole Dinge tun können, z. B. keine doppelten Verlaufsbefehle speichern ( HISTCONTROL=erasedups). Es macht keinen Sinn, eine unbegrenzte Historie zu haben, wenn Sie Hunderte von Zeilen cd ..oder ähnliches durchsuchen müssen .

Links: hier und mit der Bash-Geschichte arbeiten . Die häufig gestellten Fragen zu Bash-Variablen sind ebenfalls einen Besuch wert .

simont
quelle
13
Diese CD-Zeilen geben Ihnen den Kontext für die ausgegebenen Befehle. Sie sind tatsächlich unglaublich nützlich. Ich kann nicht verstehen, warum irgendjemand sie jemals löschen möchte, es sei denn, Sie verwenden den Verlauf nur, indem Sie einen Befehl nach dem anderen durchblättern.
Bilderstürmer
@simont Ich verwende auch die Ignorspace-Option mit HISTCONTROL und verwende diese dann für alles, was ich nicht in den Verlauf schreiben möchte, wie z. B. Passwörter.
Bigtunacan
6
Das Ordnen der Zeilen ist sehr nützlich, wenn Sie Befehlssequenzen wiederverwenden. ZB Ctrl-rSomechars Ctrl-o Ctrl-o Ctrl-o Ctrl-o. Deshalb behalte ich Duplikate in der Geschichte.
Stéphane Gourichon
1
@ StéphaneGourichon wofür Ctrl-o?
Ciprian Tomoiagă
4
@ CiprianTomoiagă Ctrl-oführt den Befehl an der Eingabeaufforderung aus und zeigt den Befehl sofort nach dem vorherigen in der Geschichte an. Ein Vorteil besteht darin, dass nach Ctrl-rdem Auffinden eines alten Befehls (möglicherweise mit dem Aufwärts- und Abwärtspfeil, um zu benachbarten Befehlen im Verlauf zu wechseln) ausreichend Ctrlgedrückt und omehrmals gedrückt werden muss , um eine vorherige Befehlsreihe erneut auszuführen, selbst in einer Endlosschleife falls Sie es wollen. Siehe auch GNU Readline - Wikipedia
Stéphane Gourichon
22

Hier gibt es (mindestens) zwei relevante Umgebungen:

  • HISTSIZE: Die Anzahl der Einträge in der Verlaufsdatei
  • HISTFILESIZE: Die Anzahl der Zeilen in der Verlaufsdatei

Ich denke, wir können uns darauf einigen, dass der Begriff unbegrenzt oft der gleiche wie sehr groß ist (oder haben Sie unbegrenzten Dateispeicher?). Stellen Sie also einfach die Werte sehr groß ein.

Jörg Beyer
quelle
23
"Es sollte beachtet werden, dass 1000000000 nur für sehr kleine Werte von unendlich gleich unendlich ist. - sepp2k" lol. Ja, ich bin zufrieden mit kleinen Werten der Unendlichkeit (z. B. einem Monat häufiger Terminalbenutzung).
Francis Haart
6
Ein Monat häufiger terminaler Nutzung ist ein unendlich kleiner Teil der Unendlichkeit. Ich würde sagen, dass eine Lebensdauer häufiger Terminalbenutzung einem sehr, sehr kleinen Wert von unendlich entspricht. Aber eine lebenslange häufige Terminalnutzung ist gut genug für meine Shell-Geschichte. ;)
Bilderstürmer
2
Zumindest ältere Versionen von zsh stürzen ab, wenn Sie HISTSIZE und / oder HISTFILESIZE zu groß einstellen, weil versucht wird, genügend Speicher vorab zuzuweisen. Dies wurde relevant, wenn Tools ausgeführt wurden, die zsh als Shell verwenden (z. B. dbx).
Brian Vandenberg