Jak mogę zapobiec wyświetlaniu poleceń w historii Bash?


96

Czasami, gdy uruchamiam takie polecenia rm -rf XYZ, nie chcę, aby było to rejestrowane w historii Bash, ponieważ mogę przypadkowo uruchomić to samo polecenie ponownie przez reverse-i-search. Czy istnieje dobry sposób, aby temu zapobiec?



Chociaż bash może być używany do pisania skryptów powłoki (a więc programowania), ten konkretny aspekt nie ma absolutnie nic wspólnego z programowaniem (historia jest tylko rzeczą interaktywną). Głosowanie za zamknięciem.
paxdiablo

Odpowiedzi:


114

Jeśli ustawisz HISTCONTROLzmienną środowiskową na ignoreboth(która jest zwykle ustawiona domyślnie), polecenia z wiodącym znakiem spacji nie będą przechowywane w historii (tak samo jak duplikaty).

Na przykład:

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

Oto, co man bashmówi:

HISTCONTROL

Lista wartości oddzielonych dwukropkami, kontrolujących sposób zapisywania poleceń na liście historii. Jeśli lista wartości zawiera ignorespace, wiersze rozpoczynające się spacją nie są zapisywane na liście historii . Wartość ignoredupsargumentu powoduje, że wiersze pasujące do poprzedniego wpisu historii nie są zapisywane. Wartość ignorebothjest skrótem dla ignorespacei ignoredups. Wartość erasedupspowoduje, że wszystkie poprzednie wiersze pasujące do bieżącego wiersza są usuwane z listy historii przed zapisaniem tego wiersza. Każda wartość, której nie ma na powyższej liście, jest ignorowana. Jeśli HISTCONTROLjest nieustawiona lub nie zawiera prawidłowej wartości, wszystkie wiersze odczytane przez parser powłoki są zapisywane na liście historii, z zastrzeżeniem wartościHISTIGNORE. Drugi i kolejne wiersze wielowierszowego polecenia złożonego nie są testowane i są dodawane do historii niezależnie od wartości HISTCONTROL.

Zobacz też:


53

W swoim .bashrc / .bash_profile / gdziekolwiek chcesz, umieść export HISTIGNORE=' *'. Następnie po prostu rozpocznij dowolne polecenie, które chcesz zignorować, jednym spacją.

$ ls  # goes in history
$  ls # does not

4
Zależy to od wartości HISTCONTROLzmiennej środowiskowej, która niekoniecznie musi być ignorespaceustawiona.
sorpigal

3
Jeśli HISTCONTROLzawiera ignorespace, w rzeczywistości niepotrzebne jest tylko umieszczanie „*” w HISTIGNORE. Obie działają niezależnie.
chepner

22

Jeszcze lepsze wykorzystanie HISTIGNORE. Umożliwia to określenie zestawu wzorców, które mają być ignorowane (na przykład rm). To jest lepsze (myślę) niż tylko przepuszczanie całej historii /dev/null.


Ach tak, zapomniałem o tym :)
Corey Henderson,

13
kill -9 $$

Wiem, że to nie jest tak najlepsze jak poprzednie odpowiedzi, ale to zabije bieżącą powłokę Bash bez zapisywania czegokolwiek, przydatne, gdy HISTCONTROL nie jest ustawiony domyślnie, zapomniałeś go ustawić lub czysty i prosty zapomniałeś wstawić wiodącą spację i właśnie wpisałeś jakieś hasła i nie chcesz, aby pozostały na stałe w historii.

Jest to szybki sposób, a coś takiego jak usunięcie pliku historii nie jest tak dobre, ponieważ musisz to zrobić poza powłoką do zapisywania historii (zaloguj się jako inny użytkownik i użyj su / sudo, tworząc zadanie w tle itp.)


8

Możesz zrobić jedną z dwóch rzeczy:

export HISTFILE=/dev/null

Lub rozpocznij polecenie spacją.


5
przestrzeń, zanim to będzie niesamowite
Eric Fortis,

8
Niektórzy z nas uważają, że automatyczne ignorowanie poleceń poprzedzonych spacją jest naprawdę złym pomysłem i dlatego nie ma ignorespaceich domyślnie.
sorpigal

3
Ustawianie HISTFILEten sposób zapobiega przechowywania żadnej historii, a nie zapobiec polecenie dodawanych do historii w pamięci.
chepner

3

Lub

unset HISTFILE

(podobnie jak w poprzedniej odpowiedzi, tylko krócej: export HISTFILE = / dev / null)


1
Ma to wpływ tylko na historię na dysku, a nie na historię w pamięci.
chepner

2

Podczas uruchamiania powłoki jawnie usuwam historię z wpisów, których nie chcę tam być. Na przykład nie chcę żadnego rm -rfw historii (to trauma po usunięciu katalogu pełnego wyników przetwarzanych przez noc, tylko jednym Arrow-Up+ Enter:)

Umieściłem następujący fragment w moim pliku init (działa z .zshrc, powinien również działać .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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.