Wie verhindere ich, dass Befehle im Bash-Verlauf angezeigt werden?

93

Wenn ich Befehle wie ausführe, möchte rm -rf XYZich manchmal nicht, dass dies im Bash-Verlauf aufgezeichnet wird, da ich möglicherweise versehentlich denselben Befehl von erneut ausführen kann reverse-i-search. Gibt es eine gute Möglichkeit, dies zu verhindern?

Jeeyoung Kim
quelle
serverfault.com/questions/48769/…
Ciro Santilli 法轮功 冠状 冠状 病 六四 28
Während bash kann zum Schreiben von Shell - Skripten (daher der Programmierung), das verwendet werden , insbesondere Aspekt davon hat absolut nichts zu tun mit der Programmierung (Geschichte ist eine interaktive-only Sache). Abstimmung zum Schließen.
Paxdiablo

Antworten:

110

Wenn Sie die HISTCONTROLUmgebungsvariable auf ignoreboth(normalerweise standardmäßig festgelegt) festgelegt haben, werden Befehle mit einem führenden Leerzeichen nicht im Verlauf gespeichert (sowie keine Duplikate).

Beispielsweise:

$ HISTCONTROL=ignoreboth
$ echo test1
$  echo test2
$ history | tail -n2
 1015  echo test1
 1016  history | tail -n2

Folgendes man bashsagt:

HISTCONTROL

Eine durch Doppelpunkte getrennte Liste von Werten, die steuern, wie Befehle in der Verlaufsliste gespeichert werden. Wenn die Werteliste enthält ignorespace, werden Zeilen, die mit einem Leerzeichen beginnen, nicht in der Verlaufsliste gespeichert . Ein Wert von ignoredupsbewirkt, dass Zeilen, die mit dem vorherigen Verlaufseintrag übereinstimmen, nicht gespeichert werden. Ein Wert von ignorebothist eine Abkürzung für ignorespaceund ignoredups. Ein 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 HISTCONTROLdies nicht festgelegt ist oder keinen gültigen Wert enthält, werden alle vom Shell-Parser gelesenen Zeilen vorbehaltlich des Werts von in der Verlaufsliste gespeichertHISTIGNORE. Die zweite und die folgenden Zeilen eines mehrzeiligen zusammengesetzten Befehls werden nicht getestet und unabhängig vom Wert von zum Verlauf hinzugefügt HISTCONTROL.

Siehe auch:

Kenorb
quelle
51

Geben Sie in Ihr .bashrc / .bash_profile / ein, wo immer Sie möchten export HISTIGNORE=' *'. Beginnen Sie dann einfach einen Befehl, den Sie ignorieren möchten, mit einem Leerzeichen.

$ ls  # goes in history
$  ls # does not
Rhdoenges
quelle
4
Dies hängt vom Wert der HISTCONTROLUmgebungsvariablen ab, die nicht unbedingt ignorespacefestgelegt wurde.
Sorpigal
3
Wenn es HISTCONTROLenthält ignorespace, ist es eigentlich nur redundant, `*` in aufzunehmen HISTIGNORE. Die beiden arbeiten unabhängig voneinander.
Chepner
22

Noch besser nutzen HISTIGNORE. Auf diese Weise können Sie eine Reihe von Mustern angeben, die ignoriert werden sollen (z. B. rm). Es ist besser (denke ich), als nur die ganze Geschichte anzusprechen /dev/null.

Bmatheny
quelle
Ah ja, habe das vergessen :)
Corey Henderson
13
kill -9 $$

Ich weiß, dass dies nicht so gut ist wie die vorherigen Antworten, aber dies wird die aktuelle Bash-Shell töten, ohne etwas zu speichern. Dies ist nützlich, wenn HISTCONTROL nicht standardmäßig eingestellt ist, Sie es vergessen haben oder schlicht und einfach vergessen haben, ein führendes Leerzeichen einzufügen und Sie haben gerade einige Passwörter eingegeben und möchten nicht, dass sie dauerhaft im Verlauf bleiben.

Dies ist der schnelle Weg, und so etwas wie das Löschen der Verlaufsdatei ist nicht so gut, da Sie dies außerhalb einer Verlaufsspeicher-Shell tun müssen (melden Sie sich als anderer Benutzer an und verwenden Sie su / sudo, erstellen Sie einen Hintergrundjob usw.)

Der Zauberer
quelle
8

Sie können eines von zwei Dingen tun:

export HISTFILE=/dev/null

Oder beginnen Sie den Befehl mit einem Leerzeichen.

Corey Henderson
quelle
5
ein Raum, bevor das fantastisch ist
Eric Fortis
8
Einige von uns halten das automatische Ignorieren von Befehlen, denen ein Leerzeichen vorangestellt ist, für eine wirklich schlechte Idee und haben sie daher nicht ignorespacestandardmäßig festgelegt.
Sorpigal
3
Durch HISTFILEdiese Einstellung wird das Speichern eines Verlaufs verhindert und der Befehl wird nicht zum speicherinternen Verlauf hinzugefügt.
Chepner
3

Oder

unset HISTFILE

(ähnlich der vorherigen Antwort nur kürzer: export HISTFILE = / dev / null)

Aledra
quelle
1
Dies wirkt sich nur auf den On-Disk-Verlauf aus, nicht auf den In-Memory-Verlauf.
Chepner
2

Beim Shell-Start bereinige ich explizit den Verlauf von den Einträgen, die ich nicht dort haben möchte. Zum Beispiel möchte ich keine rm -rfin der Geschichte (es ist ein Trauma, nachdem ein Verzeichnis voller Ergebnisse entfernt wurde, die über Nacht verarbeitet wurden, nur mit einem einzigen Arrow-Up+ Enter:)

Ich habe das folgende Snippet in meine Init-Datei eingefügt (funktioniert mit .zshrc, sollte auch mit funktionieren .bashrc)

# ...
HISTFILE=~/.zshhistory
# ...

# remove dangerous entries from the shell history
temp_histfile="/tmp/$$.temp_histfile"
grep -v -P '^rm .*-rf' $HISTFILE > $temp_histfile
mv $temp_histfile $HISTFILE
Jakub M.
quelle