Bash_history für eine bestimmte Shell vorübergehend aussetzen?

115

Gibt es eine Möglichkeit, die Verlaufsverfolgung in Bash vorübergehend auszusetzen, um in eine Art "Inkognito" -Modus zu wechseln? Ich gebe Dinge in mein Terminal ein, die ich nicht aufzeichnen möchte, vertrauliche Finanzinformationen.

Naftuli Kay
quelle

Antworten:

153

Dies sollte das sein, wonach Sie suchen:

unset HISTFILE

Von man bash

Wenn HISTFILE nicht festgelegt ist oder wenn die Verlaufsdatei nicht beschreibbar ist, wird der Verlauf nicht gespeichert.

Wenn Sie es alternativ aus- und wieder einschalten möchten, ist die Verwendung möglicherweise einfacher set:

Ausschalten

set +o history

Schalte ein

set -o history
SiegeX
quelle
12
Der Wert von HISTFILEwird nur beim Beenden von bash überprüft, daher funktioniert die erste Methode nicht wie sie ist (wenn Sie den Wert wiederherstellen, wird der Befehl gespeichert). set +o historyfunktioniert wie angewiesen.
Gilles
5
Danke, sehr gut. Ich werde set +o historyund verwenden, set -o historyum hin und her zu
wechseln,
1
unset HISTFILEfunktioniert nicht. set -/+o historyklappt wunderbar! danke
kholofelo Maloma
4
Ein Tipp: Wenn Sie ein Leerzeichen vor dem Befehl einfügen (den Befehl mit einem Leerzeichen beginnen), wird es nicht in Ihrem Verlauf aufgezeichnet, und die Aufwärts- / Abwärtspfeiltasten zeigen es ebenfalls nicht an.
Mahdi
1
Dies wird nicht funktionieren in Zsh BTW
Shubham Chaudhary
33

Setzen Sie HISTCONTROL="ignorespace"mit bash ein Leerzeichen und gehen Sie jedem Befehl voran, den Sie nicht in der Historie aufzeichnen möchten. Falls Sie vergessen haben, Maßnahmen zu ergreifen, können Sie auch history -d <number>einen bestimmten Eintrag löschen oder history -cden gesamten Befehlsverlauf löschen .

forcefsck
quelle
27

Stellen Sie sicher, dass HISTCONTROLenthält ignorespace. Sie werden wahrscheinlich HISTCONTROL=ignorespace( HISTCONTROL=ignoredups:ignorespaceoder etwas) zu Ihrem hinzufügen wollen ~/.bashrc. Dann wird jede Befehlszeile, die mit einem Leerzeichen beginnt, aus dem Verlauf entfernt.

Eine andere Möglichkeit besteht darin, eine neue Bash-Sitzung zu starten, die ihren Verlauf nicht speichert.

$ bash
$ unset HISTFILE
$ sooper-sekret-command
$ exit
$ #back in the parent shell
Gilles
quelle
5

Wenn Sie vermeiden möchten, mehrere Befehle zu speichern, und dennoch den Aufwärtspfeil verwenden möchten, um auf vorherige Befehle zuzugreifen, verwenden Sie:

$ bash                        # open a new session.
$ unset HISTFILE              # avoid recording commands to file.
$ commands not recorded
.
.
$ exit
$

Es gibt vier Möglichkeiten (Ebenen), um zu steuern, wie Befehle gespeichert werden.

  1. Die erste und einfachste ist die Verwendung ignorespace(oder Ignoranz) von:

    $ HISTCONTROL="ignorespace${HISTCONTROL:+:$HISTCONTROL}"

    Auf diese Weise können Sie ein Leerzeichen vor den Befehlen verwenden, die nicht in der Speicherliste von gespeichert werden sollen history. Infolgedessen wird auch vermieden, dass ein Befehl an die in aufgeführte Datei gesendet wird, da im Speicher kein Befehl gespeichert ist, der in die Datei gesendet werden könnte $HISFILE.

  2. Vermeiden Sie das Aufzeichnen von Befehlen in die Datei in $HISTFILE:

    $ unset HISTFILE

    Wenn nicht festgelegt, wird der Befehlsverlauf beim Beenden einer Shell nicht gespeichert.

    Null HISTFILE=''und / oder HISTFILE=/dev/nullauf den gleichen Effekt eingestellt. Verstehen Sie, dass noch Befehle in der Speicherliste aufgezeichnet werden, und versuchen Sie es mit dem historyBefehl oder dem Aufwärtspfeil.

    Warnung: Wenn HISTFILE zurückgesetzt wird, bevor die Shell existiert, kann alles, was im Speicher aufgezeichnet wurde, trotzdem in die Datei geschrieben werden.

  3. Vermeiden Sie das Aufzeichnen neuer Befehle in der Verlaufsliste im Speicher. Und da es sich nicht im Speicher befindet, kann es nicht in einer Datei aufgezeichnet werden.

    $ shopt -ou history              # or set +o history

    Erneut aktivieren mit shopt -os history(oder set -o history)

  4. Entfernen Sie alle Befehle aus der Verlaufsliste im Speicher:

    $ HISTSIZE=0

    Alle Befehle werden gelöscht (aus dem Speicher) und daher kann natürlich nichts in der Datei gespeichert werden, bis die Variable wieder auf einen gültigen numerischen Wert gesetzt wird.

Isaac
quelle
//, Dies umfasst alle Antworten mit Ausnahme der Antwort von @Ambrose auf einer praktischen Seite. Gut gemacht, @Isaac. Wären Sie bereit, den Dokumenten dafür einen oder zwei Links hinzuzufügen? Ziemlich sicher man history, dass es für die meisten von uns nicht klappen wird.
Nathan Basanese
1
@ NathanBasanese Erweitert. Besser?
Isaac
// , Ja! Würde ich zu Recht davon ausgehen, dass diese aus den integrierten Dokumenten von Bash Variables und Shopt stammen ?
Nathan Basanese
// Auch, während ich las die Bash Variablen Dokumentation , stieß ich auf HISTIGNORE, die subsumesdie Funktion von HISTCONTROL.
Nathan Basanese
(Angenommen, Sie verwenden Linux): Was passiert, wenn Sie den Befehl ausführen LESS=+'/^ *HISTI' man bash(sind das nicht die "Manualpages"?). @ NathanBasanese
Isaac
3

Es gibt eine einfache Möglichkeit, den Verlauf zu deaktivieren, sodass Befehle nicht in der .bash_historyDatei gespeichert werden.

Sie müssen das Leerzeichen oder den Tabulator vor jeden Befehl setzen, damit dieser Befehl nicht im Verlauf gespeichert wird. Zum Beispiel:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

Der pwdBefehl wird nicht im Verlauf gespeichert, da Whitespace im Vordergrund steht.

Kalanidhi M.
quelle
Das funktioniert nicht; Bash beschwert sich, dass "-" oder "-history" oder andere mit Bindestrich versehene Befehle nicht gefunden werden können.
Samuel A. Falvo II
2
Dies funktioniert nur, wenn HISTCONTROL = "ignorespace" wie in forcefscks Antwort festgelegt ist
DeveloperChris
1
export HISTFILE=/dev/null 

Das ist mein Weg. Nur für den Fall, dass das nicht gesetzte HISTORY / HISTFILE / HISTCONTROL, etc ... nicht funktioniert, hat das Exportieren nach / dev / null immer für mich funktioniert.

Ambrose
quelle
Für die vorübergehende Unterbrechung der Geschichte? Das hat bei mir als regulärer Befehl nicht funktioniert. Nachfolgende Befehle wurden im Verlauf protokolliert. Rufen Sie dies in .bash_profile oder einem Skript auf? GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Mat Gessel