Jak zamknąć terminal bez zapisywania historii?

33

Nieraz przypadkowo uruchomiłem wiele poleceń i zepsułem swoją historię bash. Jak zamknąć terminal bez zapisywania historii bash? Używam Fedory.

Michał Mrożek
źródło

Odpowiedzi:

25

Historia twojej powłoki jest zapisywana w pliku wskazanym przez HISTFILEzmienną. Więc:

unset HISTFILE

Odnosi się to również do zsh, ale nie do ksh, który zapisuje do pliku wskazywanego przez $HISTFILEczas uruchomienia powłoki (i odwrotnie, decydujesz się zapisać swoją historię w ksh po uruchomieniu powłoki).

Gilles „SO- przestań być zły”
źródło
Czy mogę tego użyć, zanim wyloguję się po zanieczyszczeniu historii? i czy to się na tej sesji? nie muszę set HISTFILEnastępnym razem się logować? (po prostu powiedz, czy jest to poprawne czy niepoprawne)
@ acidzombie24 To prawda, zmiany zmiennych środowiskowych nie są zapisywane między sesjami, chyba że zmiany zostaną zapisane jawnie, np. w plikach rc.
jw013,
31

Krótka odpowiedź:

Wpisz to w odpowiedzi na monit:

$ kill -9 $$

To zabije twoją powłokę od razu, bez możliwości wykonania przez nią jakiejkolwiek czynności , takiej jak przechwytywanie sygnału, zapisywanie historii, wykonywanie ~/.bash_logout, ostrzeganie o zatrzymanych zadaniach lub jakiekolwiek inne dobre rzeczy.

Długa odpowiedź:

Uwaga: te opcje nie wykluczają się wzajemnie; można z nich korzystać jednocześnie.

Opcja 1:

Jeśli jesteś perfekcjonistą, jeśli chodzi o zaśmiecanie pliku historii, możesz zmodyfikować HISTIGNOREzmienną, aby zawierała glob poleceń, których nie chcesz nagrywać. Na przykład, jeśli dodasz HISTIGNORE='ls*:cd*'do niego ~/.bashrcdowolne wystąpienie lsi cdnie zostanie wstawione do pliku historii.

Opcja 2:

Jeśli chcesz kontrolować na zasadzie polecenia po poleceniu, które polecenia zostaną pominięte w historii, możesz ustawić, HISTCONTROL='ignorespace'które będą pomijać wszystkie wiersze poleceń rozpoczynające się spacją. Użycie ignorebothspowoduje również pominięcie powtarzających się wierszy. Następnie naciśnięcie klawisza spacji przed wprowadzeniem polecenia spowoduje, że nie pojawi się on w pliku historii.

Opcja 3:

Jeśli chcesz, aby po zamknięciu terminala powłoka natychmiast się kończy, możesz trapzasygnalizować, że program terminalowy wysyła powłokę ( xtermnp. Wysyła SIGHUPnastępnie czeka na zakończenie powłoki) i robi wyjście bez zapisywania historii, gdy odbiera ten sygnał. Dodaj to do ~/.bashrc:

# don't record history when the window is closed
trap 'unset HISTFILE; exit' SIGHUP
amfetamachina
źródło
2
+1 za metodę „zabij -9 $$”. Jest to z pewnością jeden sposób na obejście sytuacji, w których HISTIGNORE itp. Są ustawione jako tylko do odczytu.
Corey Henderson
7
Nie sądzę, że dobrym pomysłem jest promowanie używania kill -9do czegokolwiek oprócz tragicznych sytuacji, gdy wszystko inne zawiodło.
Christoffer Hammarström
1
Wysyłanie SIGKILL nigdy nie jest dobrym pomysłem jako standardowa procedura operacyjna. Stosuj odpowiednie procedury, takie jak rozbrojenie HISTFILE.
Arcege
@Arcege TMTOWTDI.
amfetamachina
Chciałem wiedzieć coś przeciwnego - niestety, jak zabić basha, upewniając się, że BĘDZIE on uratować jego historię - i to odpowiedziało na moje pytanie, dzięki.
mveroone
3

Jestem zaskoczony, aby zobaczyć, nikt nie zaproponował history -cbezpośrednio przed exit. IINM (nie jestem ekspertem), który da sobie radę.

msh210
źródło
2
Jesteś na dobrej drodze: history -rponownie przeczyta plik historii, więc zapisywanie stanie się niemożliwe.
Simon Richter
Opróżnianie historii to zły nawyk ... Historia powłoki zawiera wiele przydatnych informacji o tym, kto co zrobił. jest to bardzo przydatne dla osób, które są nowe na twoich platformach (chyba że masz 100% pewności co do dokumentacji, zarządzania zmianami)
Franklin Piat
2

Istnieją dwie zmienne środowiskowe, których bash używa do określenia pliku historii i liczby wierszy, które należy do niego zapisać po wyjściu z powłoki.

Możesz wyrzucić historię sesji za pomocą dowolnej z nich (ustaw w trakcie sesji, którą chcesz pominąć w pliku historii):

HISTFILE=/dev/null

lub

HISTSIZE=0

Każda z nich działa dobrze w Bash na Fedorze

Eli Heady
źródło
1

Nie jestem pewien, dlaczego tak bardzo zależy ci na historii poleceń. Jeśli często potrzebujesz pewnych poleceń, możesz mieć więcej zabawy, jeśli zdefiniujesz dla nich aliasy, dzięki czemu możesz je odzyskać za pomocą dwóch naciśnięć klawiszy, zamiast szukać ich w historii.

Simon Richter
źródło
0
  1. Eli już dał ci poprawną odpowiedź na Bash, którą należy ustawić HISTSIZE=0.

  2. Chciałbym tylko dodać metodę, aby to zrobić dla ekranu GNU . Naciśnij Ctrl+A(sekwencja ucieczki ekranu), a następnie :scrollback 0. Spowoduje to usunięcie historii przewijania. Teraz możesz od razu :scrollback 15000zresetować rozmiar bufora przewijania.

gsbabil
źródło
Kiedy PO powiedział, że ich używa screen(1)?
amfetamachina
Nie zrobił tego. Ale możesz uruchomić Bash w sesji ekranowej, a HISTSIZE = 0 nadal pozostawi szczegóły twojej aktywności w buforze przewijania ekranu. Tak więc, jeśli naprawdę chcesz, aby był czysty, musisz zrobić to scrollback=0samo.
gsbabil
Bufor przewijania jest usuwany po zamknięciu okna (tj. Po wyjściu powłoki). Co powiesz na wpisanie Ctrl-a H? Czy to zabije plik dziennika?
amfetamachina
@amphetamachine: nie, rozpocznie tylko / zakończy rejestrowanie bieżącego okna. Co więcej, Ctrl+a Hani Ctrl+a :clearnie usunie historii. Trzeba Ctrl+a :scrollback 0. Możesz to przetestować sam. Rozpocznij nową sesję ekranu. Teraz zrób cat /etc/passwd. Teraz wykonaj dowolną z powyższych czynności - Ctrl+a Hlub Ctrl+a :clear. Teraz spróbuj skopiować z bufora ekranu, przekazując Ctrl+a [następnie strzałkę w górę, aby przejść w górę i zobaczyć, jak daleko można się posunąć do skopiowania. Jeśli zrobiłeś a Ctrl+a :scrollbacknastępnie a clear, posunąłbyś się tylko tak daleko, jak możesz zobaczyć w bieżącym oknie, ponieważ nie będzie żadnego bufora przewijania.
gsbabil