Czy tymczasowo zawiesić bash_history na danej powłoce?

115

Czy istnieje sposób na tymczasowe zawieszenie śledzenia historii w bash, aby wejść w tryb „incognito”? Wchodzę do mojego terminalu rzeczy, których nie chcę nagrywać, poufne informacje finansowe.

Naftuli Kay
źródło

Odpowiedzi:

153

To powinno być to, czego szukasz:

unset HISTFILE

Od man bash

Jeśli HISTFILE nie jest ustawiony lub plik historii jest nie do zapisania, historia nie jest zapisywana.

Alternatywnie, jeśli chcesz go wyłączyć, a następnie włączyć ponownie, może być łatwiejsze w użyciu set:

Wyłączyć

set +o history

Włączyć

set -o history
SiegeX
źródło
12
Wartość HISTFILEjest sprawdzana tylko po wyjściu basha, więc pierwsza metoda nie działa tak jak jest (jeśli przywrócisz wartość, polecenie zostanie zapisane). set +o historydziała zgodnie z zaleceniami.
Gilles
5
Dzięki, świetnie. Będę używać set +o historyi set -o historyprzełączać się tam iz powrotem, gdy będę robił tajne rzeczy;)
Naftuli Kay
1
unset HISTFILEnie działa. set -/+o historydziała jak marzenie! dzięki
kholofelo Maloma
4
Wskazówka: jeśli umieścisz spację przed poleceniem (rozpocznij polecenie spacją), nie zostanie on zapisany w twojej historii, a klawisze strzałek w górę / w dół również go nie pokażą.
Mahdi
1
To nie zadziała w zsh btw
Shubham Chaudhary
33

Używając bash, ustaw HISTCONTROL="ignorespace"i poprzedzaj spacją dowolne polecenie, którego nie chcesz zapisywać w historii. W przypadku zapomnienia o podjęciu jakichkolwiek działań można również history -d <number>usunąć konkretny wpis lub history -cwyczyścić całą historię poleceń.

forcefsck
źródło
27

Upewnij się, że HISTCONTROLzawiera ignorespace. Prawdopodobnie będziesz chciał dodać HISTCONTROL=ignorespace( HISTCONTROL=ignoredups:ignorespacelub coś) do swojego ~/.bashrc. Następnie dowolny wiersz polecenia rozpoczynający się spacją jest pomijany w historii.

Inną możliwością jest rozpoczęcie nowej sesji bash, która nie zapisuje historii.

$ bash
$ unset HISTFILE
$ sooper-sekret-command
$ exit
$ #back in the parent shell
Gilles
źródło
5

Jeśli chcesz uniknąć przechowywania kilku poleceń, a nadal chcesz użyć strzałki w górę, aby uzyskać dostęp do poprzednich poleceń, użyj:

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

Istnieją cztery sposoby (poziomy) kontrolowania sposobu przechowywania poleceń.

  1. Pierwszym i najprostszym jest użycie ignorespace(lub zignorowanie obu):

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

    Umożliwi to użycie spacji przed poleceniami, których chcesz uniknąć zapisywania na liście pamięci history. W konsekwencji, ponieważ w pamięci nie ma zapisanego polecenia, które można by wysłać do pliku, uniknie także wysłania jednego polecenia do pliku wymienionego w $HISFILE.

  2. Unikaj nagrywania poleceń do pliku w $HISTFILE:

    $ unset HISTFILE

    Jeśli nie jest ustawiony, historia poleceń nie jest zapisywana po wyjściu powłoki.

    Null HISTFILE=''i / lub ustawione na HISTFILE=/dev/nulldziałanie z tym samym efektem. Dowiedz się, że polecenia są nadal zapisywane na liście pamięci, wypróbuj historypolecenie lub strzałkę w górę.

    Ostrzeżenie: jeśli HISTFILE zostanie zresetowany przed istnieniem powłoki, wszystko, co zostało zapisane w pamięci, może zostać zapisane w pliku.

  3. Unikaj zapisywania nowych poleceń na liście historii w pamięci. Ponieważ nie ma go w pamięci, nie można go zapisać do pliku.

    $ shopt -ou history              # or set +o history

    Ponownie włącz za pomocą shopt -os history(lub set -o history)

  4. Usuń wszystkie polecenia z listy historii w pamięci:

    $ HISTSIZE=0

    Wszystkie polecenia są usuwane (z pamięci) i dlatego nic nie może być zapisane do pliku, dopóki zmienna nie zostanie ponownie ustawiona na pewną prawidłową wartość liczbową.

Izaak
źródło
//, Obejmuje wszystkie odpowiedzi oprócz odpowiedzi @Abbrose na jednej wygodnej stronie. Dobra droga, @Isaac. Czy byłbyś skłonny dodać do tego dokumentu dwa lub dwa linki? Dość pewny man historynie będzie go wyciąć dla większości z nas.
Nathan Basanese
1
@NathanBasanese Expanded. Lepszy?
Izaak
// , Tak! Czy miałbym rację, zakładając, że pochodzą one od zmiennych Bash i wbudowanych dokumentów Shopt ?
Nathan Basanese
//, Ponadto, kiedy czytałem dokumentację zmiennych Bash , natknąłem się na to HISTIGNORE, której subsumesfunkcji HISTCONTROL.
Nathan Basanese
(Zakładając, że używasz Linuksa): Co się stanie, jeśli wykonasz polecenie LESS=+'/^ *HISTI' man bash(czy to nie są „strony podręcznika”?). @NathanBasanese
Izaak
3

Jest jeden prosty sposób na wyłączenie historii, więc polecenia nie będą przechowywane w .bash_historypliku.

Musisz umieścić spację lub tabulator przed dowolnym poleceniem, aby polecenie nie zostało zapisane w historii. Na przykład:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

pwdKomenda nie dostanie sklep w historii, ponieważ ma spacje z przodu.

Kalanidhi M.
źródło
To nie działa; Bash skarży się, że nie można znaleźć „-” lub „-historia” ani innych dzielonych poleceń.
Samuel A. Falvo II,
2
To nie zadziała, chyba że HISTCONTROL = "ignorespace" jest ustawiony jak w odpowiedzi forcefsck
DeveloperChris
1
export HISTFILE=/dev/null 

To mój sposób na goto. Na wypadek, gdyby rozbrojony HISTORY / HISTFILE / HISTCONTROL itp. Nie działa, eksportowanie go do / dev / null zawsze działało dla mnie.

Ambroży
źródło
Do czasowego zawieszenia historii? Nie działało to dla mnie jako zwykłe polecenie. Kolejne polecenia zostały zarejestrowane w historii. Czy nazywasz to w .bash_profile lub skrypcie? GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Mat Gessel