Manchmal werden Verlaufsbefehle nicht in .bash_history gespeichert

20

Ich habe gestern in meinem CentOS 7 viele Befehle ausgegeben. Aber als ich diese Befehle heute abrufen wollte, stellte ich fest, dass es keine Aufzeichnungen gab. Als ich die Datei öffnete .bash_history, konnte ich immer noch nicht die Befehle finden, die ich gestern ausgegeben habe, aber ich habe vor ein paar Tagen viele alte Befehle gefunden. Warum wurden die letzten Befehle nicht gespeichert? Wie kann ich die Verlaufsfunktion erhöhen?

Jack
quelle
Manchmal, wenn das Terminal abnormal geschlossen wird, wird der Verlauf nicht gespeichert, es ist mir auch passiert, aber ich kenne die Umstände nicht, die dieses Verhalten verursachen
mazs

Antworten:

11

Die wahrscheinlichste Ursache dafür, dass Verlaufselemente nicht angezeigt werden, ist, dass sie nicht HISTFILEauf "nichts" oder " HISTSIZENull" gesetzt werden. Sie melden sich zweimal auf demselben Computer an und beenden die zweite Bash-Instanz (in der Sie wenig oder nichts getan haben) nach derjenigen, auf der sie sich befanden du hast viel getan Standardmäßig führt Bash keine Historien zusammen und der zweite Bash-Exit überschreibt das .bash_history, was beim ersten Bash-Exit so schön aktualisiert wurde.

Um dies zu verhindern, können Sie an die Verlaufsdatei anhängen, anstatt sie zu überschreiben. Verwenden Sie dazu die histappendShell-Option:

Wenn die Shell-Option histappend aktiviert ist (siehe Beschreibung von shopt unter SHELL BUILTIN COMMANDS unten), werden die Zeilen an die Verlaufsdatei angehängt, andernfalls wird die Verlaufsdatei überschrieben.

Weitere Details in dieser Antwort , einschließlich , wie man verwendet HISTSIZE, HISTFILESIZEund HISTCONTROLGröße zu steuern, Duplikate usw.

Anthon
quelle
3

Um die Geschichte Größe Verwendung zwei BASH Variablen zu ändern HISTSIZE, HISTFILESIZE( in der Regel festgelegt in .bashrc).

Beschreibung aus der BASH-Manpage:

HISTSIZE Die Anzahl der Befehle, die im Befehlsverlauf gespeichert werden sollen (siehe HISTORY unten). Wenn der Wert 0 ist, werden Befehle nicht in der Verlaufsliste gespeichert. Numerische Werte kleiner als Null führen dazu, dass jeder Befehl in der Verlaufsliste gespeichert wird (es gibt keine Begrenzung). Die Shell setzt den Standardwert auf 500, nachdem alle Startdateien gelesen wurden.

HISTFILESIZE Die maximale Anzahl der Zeilen in der Verlaufsdatei. Wenn dieser Variablen ein Wert zugewiesen wird, wird die History-Datei bei Bedarf so abgeschnitten, dass sie nicht mehr als diese Anzahl von Zeilen enthält, indem die ältesten Einträge entfernt werden. Die Verlaufsdatei wird auch auf diese Größe gekürzt, nachdem sie beim Beenden einer Shell geschrieben wurde. Wenn der Wert 0 ist, wird die Verlaufsdatei auf die Größe Null gekürzt. Nicht numerische Werte und numerische Werte unter Null verhindern das Abschneiden. Die Shell setzt den Standardwert auf den Wert von HISTSIZE, nachdem alle Startdateien gelesen wurden.

Als Beispiel habe ich das folgende Setup in meiner .bashrcDatei:

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

Ich hatte dies geschehen, aber die Lösung wurde hier nicht aufgeführt. Die Ursache war nur ein einfaches Copy + Paste-Problem. Ich habe einen Befehl aus einem anderen Dokument kopiert und in der Zwischenablage wurde ein zusätzlicher weißer Bereich angezeigt. Aus irgendeinem Grund hat dies dazu geführt, dass Ubuntu den Befehl nicht in der Verlaufsdatei speichert.

Bildbeschreibung hier eingeben

Das obige Bild war der Befehl, den ich in meinem Zwischenablageformular Google Docs hatte. Dieser Befehl wurde ausgeführt, aber in meiner Historie weggelassen. Ich bin einfach zurückgegangen und habe den Befehl ohne Leerzeichen ausgewählt, und dann ist er im Bash-Verlauf aufgetaucht.

Tycon
quelle
5
Eine der Verlaufsoptionen besteht darin, Zeilen, die mit einem Leerzeichen beginnen, zu ignorieren (nicht zu speichern). Es ist normalerweise standardmäßig aktiviert. Dies kann in Ihrem .bashrc geändert werden.
Studog
1

Stellen Sie sicher, dass Ihre HISTCONTROLUmgebungsvariable nicht auf ignorespaceoder festgelegt ist ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Sie können es ändern, indem Sie den Wert in Ihrer ~/.bash_profileoder Ihrer ~/.profileDatei festlegen:

HISTCONTROL=ignoredups

Aus der bashManpage:

HISTCONTROL

Eine durch Doppelpunkte getrennte Liste von Werten, die steuern, wie Befehle in der Verlaufsliste gespeichert werden.

Wenn die Liste der Werte enthält ignorespace, werden Zeilen, die mit einem Leerzeichen beginnen, nicht in der Verlaufsliste gespeichert.

Ein Wert von ignoredupsbewirkt, dass mit dem vorherigen Verlaufseintrag übereinstimmende Zeilen nicht gespeichert werden.

Ein Wert von ignorebothist eine Abkürzung für ignorespaceund ignoredups.

Der Wert von erasedupsbewirkt, dass alle vorherigen Zeilen, die mit der aktuellen Zeile übereinstimmen, aus der Verlaufsliste entfernt werden, bevor diese Zeile gespeichert wird.

Jeder Wert, der nicht in der obigen Liste enthalten ist, wird ignoriert.

Wenn diese HISTCONTROL Option nicht festgelegt ist oder keinen gültigen Wert enthält, werden alle vom Shell-Parser gelesenen Zeilen in der Verlaufsliste mit dem Wert von gespeichert HISTIGNORE. Die zweite und die folgenden Zeilen eines mehrzeiligen zusammengesetzten Befehls werden nicht getestet und unabhängig vom Wert von zur Historie hinzugefügt HISTCONTROL.

gawi
quelle