Warum reicht es nicht aus, den Bash-Verlauf zu löschen?

14

Früher dachte ich, das Löschen meines Bash-Verlaufs würde ausreichen, um meinen Bash-Verlauf zu löschen, aber gestern spielte meine Katze auf der rechten Seite meiner Tastatur herum, und als ich wieder an meinem Computer ankam, sah ich etwas, das ich vor einem Monat getippt hatte, und dann fing ich an zu tippen Drücke alle Tasten wie verrückt und suche, was es ausgelöst haben könnte. Die UPARROW-Taste zeigt meinen Bash-Verlauf auch nach dem Löschen von .bash_history an.

Wie kann ich meinen Bash-Verlauf wirklich löschen?

bunden
quelle
8
.bash_history wird jedes Mal überschrieben, wenn Sie eine Bash-Shell schließen. Wenn Sie bash starten, .bash_history löschen und sich abmelden, haben Sie genau nichts erreicht.
Shadur
14
Ihre Katze verdient eine große Belohnung. Sie verwenden Bash schon seit wie langer Zeit, ohne zu bemerken, dass es Befehlszeilenrückruf und -bearbeitung gibt? Geben Sie einfach jedes Mal jede Befehlszeile von Grund auf neu ein oder so? Das würde die Verwendung der Schale sehr unangenehm machen.
cas
@cas zehn Jahre. Jetzt, wo Sie es sagen, drücke ich Uparrow, um Befehle zu wiederholen, aber ich verstehe es als eine Art Kurzzeitgedächtnis, das nicht länger als ein paar Zeilen ist. Ich wurde nicht gewarnt, dass beim Löschen von .bash_history der Bash-Verlauf nicht gelöscht wird.
bunden
Das Löschen ~/.bash_historylöscht wirklich ~/.bash_history.... aber (es sei denn, Sie unternehmen Schritte, um dies zu verhindern, wie das Löschen des In-Memory-Verlaufs, indem Sie ihn history -ckurz vor dem Abmelden oder Einstellen ausführen HISTFILE=/dev/nulloder einfach nur unsetausführen) , speichert bash den aktuellen Verlauf beim Beenden erneut . Übrigens HISTSIZEteilt die Variable env bash mit, wie viele Zeilen des Verlaufs gespeichert werden sollen, und teilt bash mit, wie viele Verlaufszeilen HISTFILESIZEmaximal gespeichert werden sollen . Beides kann zB in Ihrem Telefon eingestellt werden ~/.bashrc. PS: Ihre Katze verdient eine 2. Belohnung für das Unterrichten Sie eine wertvolle Lektion :)
cas
@cas Ich denke, das Löschen von .bash_history sollte den Bash-Verlauf löschen. Es scheint mir intuitiv. Was nicht intuitiv zu sein scheint, ist Geschichte -c, Geschichte -w, uneinstellbare Variablen. Das ist verrückt aus der Perspektive der Benutzererfahrung.
Bunden

Antworten:

24

In einigen Fällen (einige Bash-Versionen) wird Folgendes ausgeführt:

$ history -c; history -w

Oder einfach

$ history -cw

Löscht den Verlauf im Speicher (der Aufwärts- und Abwärtspfeil enthält keine aufzulistenden Befehle) und schreibt diesen dann in die $HISTFILEDatei (wenn der Verlauf $HISTFILEvon der ausgeführten Bash-Instanz abgeschnitten wird).

Manchmal beschließt bash, die Datei auch dann nicht abzuschneiden $HISTFILE, wenn die histappendOption deaktiviert und $HISFILEZIZEauf 0 gesetzt ist.

In solchen Fällen funktioniert die Nuke-Option immer:

history -c; >$HISTFILE

Dadurch wird die Verlaufsliste der im Speicher aufgezeichneten Befehle und aller zuvor in der Datei aufgezeichneten Befehle gelöscht. Dadurch wird sichergestellt , dass der Lauf Shell Geschichte nicht aufgezeichnet wird entweder im internen Speicher oder Festplatte, aber auch andere laufenden Instanzen von bash (wo Geschichte aktiv ist) können eine vollständige Kopie von Befehlen aus lesen , $HISTFILEwenn bash gestartet wurde (oder wenn ein history -rausgeführt wird ) .

Wenn es auch erforderlich ist, dass nichts anderes (keine neuen Befehle) der aktuellen Sitzung in die Verlaufsdatei geschrieben unset HISTFILEwird , wird eine solche Protokollierung verhindert.

Isaac
quelle
1
Durch Bearbeiten von HISTFILE und Ausführen wird history -c && history -rder aktuelle Verlauf durch den manuell geänderten Verlauf ersetzt. In einigen Fällen ist dies möglicherweise besser, als die gesamte Geschichte wegzuwerfen.
Mikko Rantalainen
9

bashhat einen Sitzungsverlauf im Speicher, der in eine Datei geschrieben wird, wenn die Shell-Variable HISTFILEbeim bashBeenden auf einen Dateinamen gesetzt wird .

Wenn Sie die Datei löschen, auf die durch verwiesen wird HISTFILE, deaktivieren Sie diese Variable und beenden Sie siebash hinterlässt diese Shell-Sitzung keinen persistenten Verlauf.

Wird die HISTFILEVariable nicht zurückgesetzt, aber die Datei gelöscht, wird nur der persistente Verlauf geleert. Der Verlauf der aktuellen Sitzung wird jedoch gespeichert, wenn die Shell beendet wird.

Kusalananda
quelle
3
A history -c; history -wlöscht sowohl den Speicher- als auch den Dateiversionsverlauf. Das Deaktivieren von HISTFILE ist nur erforderlich, wenn keine weiteren Befehle im Verlauf protokolliert werden sollen (nicht genau das, was IMhO gefragt wurde).
Isaac
-1

"Wie kann ich meinen Bash-Verlauf wirklich löschen?"

Beenden Sie bash, starten Sie eine andere Shell und löschen Sie die Bash-Verlaufsdatei.

oder

Melden Sie sich ab, melden Sie sich bei einem anderen Konto an, das über Schreibrechte für die Verlaufsdatei verfügt, und löschen Sie die Verlaufsdatei.

Benutzer
quelle
-2

Machen Sie alles auf einmal, während Sie die Shell verlassen

echo "" > ~/.bash_history && history -c && exit
user853069
quelle
@roaima, du hast absolut recht, danke. Korrigiert
user853069