bash HISTSIZE vs. HISTFILESIZE?

174

Was ist der Unterschied in HISTSIZEvs. HISTFILESIZE?

Sie werden verwendet, um den Bash-Verlauf über die Standardzeilen von 500 hinaus zu erweitern.

Hier und in anderen Foren scheint es an Klarheit zu mangeln, warum beide benötigt werden. ( Beispiel 1 , Beispiel 2 , Beispiel 3 ).

arturomp
quelle

Antworten:

289

Kurze Antwort:

HISTSIZE ist die Anzahl der Zeilen oder Befehle, die während einer laufenden Bash-Sitzung im Speicher einer Verlaufsliste gespeichert sind.

HISTFILESIZE ist die Anzahl der Zeilen oder Befehle, die (a) zum Startzeitpunkt einer Sitzung in der Verlaufsdatei zulässig sind und (b) am Ende Ihrer Bash-Sitzung zur Verwendung in zukünftigen Sitzungen in der Verlaufsdatei gespeichert werden.

Beachten Sie den Unterschied zwischen file: auf Festplatte - und list: im Speicher.

Lange Antwort:

Alle Infos oben + einige Beispiele:

Beispiel 1 : HISTFILESIZE=10undHISTSIZE=10

  1. Sie starten Ihre Sitzung.
  2. Ihre HISTFILE (Datei, in der Ihr Bash-Befehlsverlauf gespeichert ist) wird abgeschnitten und enthält HISTFILESIZE = 10 Zeilen.
  3. Sie schreiben 50 Zeilen.
  4. Am Ende Ihrer 50 Befehle befinden sich nur die Befehle 41 bis 50 in Ihrer Verlaufsliste, deren Größe durch HISTSIZE = 10 bestimmt wird.
  5. Sie beenden Ihre Sitzung.
  6. Vorausgesetzt, es histappendist nicht aktiviert, werden die Befehle 41 bis 50 in Ihrer HISTFILE gespeichert, die jetzt die 10 Befehle enthält, die zu Beginn gehalten wurden, sowie die 10 neu geschriebenen Befehle.
  7. Ihre HISTFILE wird abgeschnitten, um HISTFILESIZE = 10 Zeilen zu enthalten.
  8. Sie haben jetzt 10 Befehle in Ihrem Verlauf - die letzten 10, die Sie gerade in der Sitzung eingegeben haben, die Sie gerade beendet haben.
  9. Wenn Sie eine neue Sitzung starten, beginnen Sie bei 1 mit einer HISTFILE von HISTFILESIZE = 10.

Beispiel 2 : HISTFILESIZE=10undHISTSIZE=5

  1. Sie starten Ihre Sitzung.
  2. Ihre HISTFILE (Datei, in der Ihr Bash-Befehlsverlauf gespeichert ist) ist so abgeschnitten, dass sie höchstens HISTFILESIZE = 10 Zeilen enthält.
  3. Sie schreiben 50 Zeilen.
  4. Am Ende Ihrer 50 Befehle befinden sich nur die Befehle 46 bis 50 in Ihrer Verlaufsliste, deren Größe durch HISTSIZE = 5 bestimmt wird.
  5. Sie beenden Ihre Sitzung.
  6. Vorausgesetzt, es histappendist nicht aktiviert, werden die Befehle 46 bis 50 in Ihrer HISTFILE gespeichert, die jetzt die 10 Befehle enthält, die zu Beginn gehalten wurden, sowie die 5 neu geschriebenen Befehle.
  7. Ihre HISTFILE wird abgeschnitten, um HISTFILESIZE = 10 Zeilen zu enthalten.
  8. Sie haben jetzt 10 Befehle in Ihrem Verlauf - 5 aus einer vorherigen Sitzung und die letzten 5, die Sie gerade in der Sitzung eingegeben haben, die Sie gerade beendet haben.
  9. Wenn Sie eine neue Sitzung starten, beginnen Sie bei 1 mit einer HISTFILE von HISTFILESIZE = 10.

Beispiel 3 : HISTFILESIZE=5undHISTSIZE=10

  1. Sie starten Ihre Sitzung.
  2. Ihre HISTFILE (Datei, in der Ihr Bash-Befehlsverlauf gespeichert ist) ist so abgeschnitten, dass sie höchstens HISTFILESIZE = 5 Zeilen enthält.
  3. Sie schreiben 50 Zeilen.
  4. Am Ende Ihrer 50 Befehle befinden sich nur die Befehle 41 bis 50 in Ihrer Verlaufsliste, deren Größe durch HISTSIZE = 10 bestimmt wird.
  5. Sie beenden Ihre Sitzung.
  6. Vorausgesetzt, es histappendist nicht aktiviert, werden die Befehle 41 bis 50 in Ihrer HISTFILE gespeichert, die nun die 5 Befehle enthält, die zu Beginn gehalten wurden, sowie die 10 neu geschriebenen Befehle.
  7. Ihre HISTFILE wird abgeschnitten, um HISTFILESIZE = 5 Zeilen zu enthalten.
  8. Sie haben jetzt 5 Befehle in Ihrem Verlauf - die letzten 5, die Sie gerade in der Sitzung eingegeben haben, die Sie gerade beendet haben.
  9. Wenn Sie eine neue Sitzung starten, beginnen Sie bei Schritt 1 mit einer HISTFILE von HISTFILESIZE = 5.

Infos von elixir_sinari :

Die Verlaufsdatei wird während der Eingabe der Befehle nicht aktualisiert. Die Befehle werden separat in einer "Liste" gespeichert (Zugriff über den Befehl history). Die Anzahl dieser gespeicherten Befehle wird durch den Wert HISTSIZE gesteuert. Wenn die Shell (interaktiv) beendet wird, werden die letzten $ HISTSIZE-Zeilen aus dieser "Liste" kopiert / an $ HISTFILE angehängt. Wenn HISTFILESIZE festgelegt ist, wird nach diesem Vorgang sichergestellt, dass in $ HISTFILE nur (neueste) $ HISTFILESIZE-Zeilen vorhanden sind. Und wenn die Shell startet, wird die "Liste" von $ HISTFILE bis zu maximal $ HISTSIZE-Befehlen initialisiert.

Und von der man bashSeite:

Der Wert der Variablen HISTSIZE wird als Anzahl der Befehle verwendet, die in einer Verlaufsliste gespeichert werden sollen. Der Text der letzten HISTSIZE-Befehle (Standard 500) wird gespeichert. (...)

Beim Start wird der Verlauf aus der Datei initialisiert, die von der Variablen HISTFILE (Standard ~ / .bash_history) benannt wird. Die durch den Wert von HISTFILE benannte Datei wird bei Bedarf abgeschnitten, um nicht mehr als die durch den Wert von HISTFILESIZE angegebene Anzahl von Zeilen zu enthalten. (...) Wenn eine interaktive Shell beendet wird, werden die letzten $ HISTSIZE-Zeilen aus der Verlaufsliste nach $ HISTFILE kopiert. Wenn die Shell-Option histappend aktiviert ist (siehe die Beschreibung von shopt unter SHELL BUILTIN COMMANDS unten), werden die Zeilen an die Verlaufsdatei angehängt, andernfalls wird die Verlaufsdatei überschrieben. Wenn HISTFILE nicht festgelegt ist oder wenn die Verlaufsdatei nicht beschreibbar ist, wird der Verlauf nicht gespeichert. (...) Nach dem Speichern des Verlaufs wird die Verlaufsdatei so abgeschnitten, dass sie nicht mehr als HISTFILESIZE-Zeilen enthält. Wenn HISTFILESIZE nicht festgelegt ist,

arturomp
quelle
27
+1 Diese Antwort ist beeindruckend gründlich! Ein bisschen zu viel, denke ich. Die meisten Leute werden das Ende nicht erreichen. Ich denke, Sie sollten darüber nachdenken, es zusammenzufassen
slezica
22
@slezica Ich bin mit dem zweiten Teil Ihres Kommentars nicht einverstanden: Ich habe das Ende erreicht und kann sagen, dass jede Information in der Antwort nützlich ist. Die Tatsache, dass einige Leute zu faul sind, um ein paar Zeilen zu lesen, sollte es nicht rechtfertigen, nützliche Informationen für die anderen zu entfernen.
Bastien
1
@Bastien Angenommen, Sie sind ein Bullet-Point-Parser, werden Sie keine Schwierigkeiten haben, dies zu lesen.
Pithikos
6
Schauen Sie, meine Festplatte ist 1 TB groß und größtenteils leer, und ich habe viele CPU-Zyklen und RAM im Leerlauf. Ich möchte so viel Bash-Verlauf wie möglich speichern. Wenn ich also diesen dummen Befehl nachschlagen muss, habe ich ihn. Ich weiß, dass es in meiner Bash-Geschichte liegt. Um es konkreter zu machen, sagen wir bis zu 50 MB Bash-Geschichte. Welche Werte empfehlen Sie?
CivFan
2
@ Matthew sorry, weiß es nicht!
Arturomp
6

Aufbauend auf dem, was arturomp gesagt hat, und um es ein bisschen klarer zu machen.

Vorausgesetzt, Sie haben eine 2000-jährige Geschichte.

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u

Sie können reduzieren, was Ihnen angezeigt wird HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

Unabhängig davon, wie viele Befehle Sie eingeben, werden nur die letzten 5 aufgezeichnet.

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

Wir können deutlich sehen, dass unser erster Befehl ("ABC") nicht in der Geschichte enthalten ist, da nur die letzten 5 Befehle aufgezeichnet wurden.

Jetzt wird der gesamte Verlauf in einer Datei ( .bash_history) gespeichert und Sie können ändern, wie lange diese Datei mit dem dauert HISTFILESIZE. Zum Beispiel mit einem 2033 HISTFILESIZE, in meinem Fall hätte ich folgendes:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD
Pithikos
quelle
3
Welche Werte würden Sie empfehlen, wenn der gesamte Verlauf aller gleichzeitigen Terminals für immer im Bash-Verlauf gespeichert werden soll ? Mit anderen Worten, speichern Sie immer alles und löschen Sie niemals etwas.
CivFan
10
@CivFan: Setze HISTSIZE=-1und HISTFILESIZE=-1.
M. Dudley
2
Das ist absolut falsch. Wenn Sie den Wert auf -1 setzen, wird alles gelöscht.
Brendan Byrd
3
@BrendanByrd Die bashManpage sagt: Non-numeric values and numeric values less than zero inhibit truncationaber dann hatte ich nicht den Mut zu überprüfen, ob dies wahr ist, weil ich meine Geschichte nicht verlieren möchte :-)
SebMa
3
@SebMa Ich habe meine Einstellungen auf HISTSIZE='INFINITY'und geändert HISTFILESIZE='ANDBEYOND'. Da sie nicht numerisch sind, speichern sie alles. Danke für den Tipp!
Connor