Gewusst wie: Unbegrenzte Bash / Shell-Geschichte?

83

Gibt es eine Möglichkeit, eine unbegrenzte Historie in Bash zu definieren?

Dragos
quelle

Antworten:

82

Fügen Sie dies zu Ihrem .bashrc(Linux) oder .bash_profile(MacOS) hinzu:

export HISTFILESIZE=
export HISTSIZE=

Es geht los, unbegrenzte Geschichte. Derzeit habe ich 27000 Einträge :)

Von man bash:

Wenn HISTFILESIZEnicht festgelegt, wird keine Kürzung durchgeführt.

Das heißt, .bash_historywird nie abgeschnitten

Das scheint auch so zu sein HISTSIZE, obwohl ich das nicht dokumentiert finden konnte.

Ein weiteres nettes Feature, das ich ausprobieren werde, ist folgendes:

Wenn die HISTTIMEFORMATVariable festgelegt ist, werden Zeitstempel in die Verlaufsdatei geschrieben, die mit dem Verlaufskommentarzeichen gekennzeichnet ist, sodass sie möglicherweise über Shellsitzungen hinweg beibehalten werden, z.

export HISTTIMEFORMAT="%F %T "

Lassen Sie mich wissen, wenn Sie das bereits versucht haben ...

morgenrot
quelle
3
Dies funktioniert in vielen Fällen nicht und der Bash-Verlauf wird weiterhin abgeschnitten. Siehe meine Antwort unten für eine vollständigere Lösung.
Fotinakis
2
Warnung: Dies verursacht Kopfschmerzen mit gdb; Wenn Sie eine HISTSIZEVariable festlegen , wird sie als 0 verwendet, wodurch die Verlaufsgröße vollständig deaktiviert wird.
Matteo Italia
2
Anmerkungen: Sie brauchen nicht export, die HISTFILESIZEAnzahl der Zeilen (nicht die Bytes), und das Abschneiden der Verlaufsdatei erfolgt, wenn Sie die Variable setzenHISTFILESIZE (und wenn die Shell beendet wird). Stelle es also nicht zweimal in deiner Konfigurationsdatei mit unterschiedlichen Werten ein ...
vaab
@vaab: Wenn ich HISTFILE nicht exportiere, kann ich nicht sehen, was in meiner Histfile "echo $ HISTFILE" in Subshells verwendet wird. Obwohl dies nicht erforderlich ist, kann es hilfreich sein und keinen Schaden anrichten, den ich erkennen kann.
Jeff Learman
41

(Reposting meiner Antwort von https://stackoverflow.com/a/19533853/128597 )

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

Zunächst müssen Sie diesen Abschnitt Ihrer .bashrc-Datei auskommentieren oder entfernen (Standardeinstellung für Ubuntu). Andernfalls wird Ihr Verlauf in bestimmten Umgebungen (z. B. beim Ausführen von screenSitzungen) weiterhin gekürzt:

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

Hinweis: Jeder Befehl wird sofort 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, sondern müssen es manuell entfernen.

Beachten Sie auch, dass bei jeder Bash-Sitzung die vollständige 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 Ihre Bash-Startzeit bemerken.

fotinakis
quelle
4
Die Verlaufsdatei wird beim Festlegen abgeschnitten HISTFILESIZE. Aus diesem Grund sollten Sie jedes Auftreten eines solchen Ereignisses mit Ausnahme des von Ihnen gewünschten Ereignisses entfernen. Es wird auch beim Beenden der Shell abgeschnitten (aber das wird erwartet). Und du solltest nicht brauchen export.
Vaab
3
@vaab Wenn Sie nicht exportieren, bash --norcwird der Verlauf durch einen Vorgang wie folgt erneut abgeschnitten.
Yongwei Wu
1
Ich verwende export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`", um den Shell-Verlauf pro Sitzung zu trennen (basierend auf dem Hostnamen und dem TTY-Namen). Natürlich muss ich zuerst das Verzeichnis ~ / hist erstellen.
Jeff Learman
2
Beachten Sie, dass Sie möglicherweise den Wert von PROMPT_COMMAND überprüfen und nicht blindlings wiederholt anhängen möchten, da dies verrückte Dinge auf Ihrem System verursacht. Eine Nullprüfung oder besser noch eine Shell-Variablenerweiterungssuche ist wahrscheinlich sicherer.
Dragon788
3
Ich benutze dies, um das Problem zu vermeiden, auf das sich dragon788 bezieht:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg
9

In ~ / .bashrc aufnehmen :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

Diese Antwort erfüllt die folgenden Kriterien:

  1. einen separaten Master-Verlauf (keine Sitzung kann Ihren Verlauf unterbrechen)

  2. automatisches Schreiben des Verlaufs (keine Hotkeys)

  3. seltenes Schreiben (kein Anhängen nach jedem Befehl)

Hintergrund

Wenn beim interaktiven Start $HISTFILESIZEeine Zahl festgelegt ist, wird die Bash $HISTFILEauf diese Zahl gekürzt . Wenn beim interaktiven Schließen die Shell-Option histappendaktiviert ist, fügt bash $HISTSIZEZeilen an $HISTFILE, andernfalls wird überschrieben $HISTFILE.

Tipps für OSX (Terminal)

Jedes Mal, wenn eine Registerkarte in Terminal erstellt wird, ~/.bash_profilewird sie gelesen ~/.bashrc. Fügen Sie die folgende Zeile zu Ihrem hinzu ~/etc/bash_profile:

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

Tipps für den Bildschirm

Wenn Sie screen verwenden, lautet Ihre Konfigurationsdatei ~ / .screenrc. Wenn Sie möchten, dass der Bildschirm den Verlauf aufzeichnet, müssen Sie ihn nur so einstellen, dass er eine Anmeldeshell verwendet, die Ihre Bash-Startdateien abruft (und Ihren Verlauf aufzeichnet).

# use bash, make it a login shell
defshell -bash
cdosborn
quelle
3

Ein anderes Konzept (trifft möglicherweise nicht zu), aber Sie können unlimitedbei der Verwendung von Shell-Sink eine Vorgeschichte haben .

ChristopheD
quelle