Czy jest jakiś sposób na powstrzymanie dodawania polecenia do twojej historii?


65

Czy jest jakiś sposób na powstrzymanie dodawania polecenia do twojej historii? Mam polecenie, które chcę trzymać z dala od mojego pliku historii, i tak naprawdę nie dbam o to, aby było tam, gdy przeszukuję historię zapisaną w pamięci, ale to mniej niepokoi. Czy jest jakiś sposób, aby temu zapobiec, czy muszę po prostu wrócić i edytować plik historii.

aktualizacja: Nie wiedziałem, że to może być specyficzne dla powłoki. Moja skorupa jest zsh. Możesz odpowiedzieć na inne powłoki, aby ludzie wiedzieli, jak to zrobić w swojej powłoce.


linkowanie do zsh odpowiedź: superuser.com/questions/352788/…
Michael Shigorin

Odpowiedzi:


52

W ZSH :

Najpierw wstaw setopt HIST_IGNORE_SPACEdo swojego ~/.zshrc. Teraz po ponownym zalogowaniu możesz poprzedzić dowolne polecenia, których nie chcesz przechowywać w historii, znakiem space.

W instrukcji użytkownika można użyć 3 następujących opcji, aby powiedzieć, że niektóre wiersze w ogóle nie powinny przechodzić do historii:

  • HIST_IGNORE_SPACE nie przechowuje poleceń poprzedzonych spacją
  • HIST_NO_STORE nie przechowuje komendy history ( fc -l )
  • HIST_NO_FUNCTIONS nie przechowują definicji funkcji

jakaś szansa @mmckinst odpowiedź działa w Zsh? czy coś w tym stylu? a może jakakolwiek komenda, która zawiera komendę| somecommand
ksenoterracid

AFAIK w Zsh nie ma odpowiednika HISTIGNORE bash.
dogbane

@xeno zsh zapewnia funkcję przechwytującą, preexecktórej można użyć do tego celu. Jeśli zwróci wartość niezerową, polecenie nie zostanie zapisane w historii.
Keith,

1
aby zsh zignorował kilka podstawowych typowych poleceń, aliasowałem je wszystkie, aby mieć spację z przodu ... dla c (ls fg bg zadania wyjdź wyczyść reset); wykonaj alias $ c = "$ c"; zrobione
Will Norris

4
Dla leniwych przyszłych czytelników takich jak ja, którzy jeszcze nie wiedzą, jak to zrobić: setopt HIST_IGNORE_SPACEw~/.zshrc
Al.G.

25

Jeśli uruchamiasz polecenie w kółko, możesz skorzystać z funkcji ignorowania historii powłoki. Powiedzmy, że masz stronę secret.server.com, do której ssh, pliki FTP do, itp., Że nie chcesz, aby zapisano jakąkolwiek linię, która wspomina o secret.server.com:

W bashjakich można ustawić

HISTIGNORE="*secret.server.com*"

podczas gdy w zshparametrze nazywa się

HISTORY_IGNORE="*secret.server.com*"

Możesz wymienić wiele wzorów z oddzielającym je dwukropkiem. Zauważ, że każdy wzór jest dopasowany do pełnej linii wejściowej , więc może być konieczne dołączenie znaku *. Na przykład następujące zostaną wykluczone fortunez historii, ale będą przechowywać fortune -l:

HISTIGNORE="*secret.server.com*:ytalk*:fortune"
HISTORY_IGNORE="*secret.server.com*:ytalk*:fortune"

Po ustawieniu HISTIGNORE nic nie będzie pasować do listy wzorców zapisanych w .bash_history/ .zsh_historyi nawet klawisz strzałki w górę, który zwykle przywołuje poprzednie polecenie, nie będzie działał, jeśli pasuje do wzorca.


3
jest jakaś szansa, że ​​to działa w Zsh?
ksenoterrakid,

Czy istnieje opcja zignorowania tylko linii rozpoczynających się od fortuny. Coś jak HISTIGNORE="^fortune*"zignorować, fortune -lale zachować myfortune?
Bernhard

@ xenoterracide Tak, ale parametr ma inną nazwę. Właśnie edytowałem to w odpowiedzi.
n

23

W bash użyj HISTCONTROLzmiennej.

Ustaw na HISTCONTROL=ignorespace(lub HISTCONTROL=ignoreboth). Od teraz, kiedy rozpocząć linię z miejsca , to będzie nie być zapisywane w historii. Dzięki temu unika się dołączania polecenia „nie do ujawnienia” w niektórych plikach konfiguracyjnych.

Mimo to zdarza się, że zapomina się dodać miejsce, a następnie chce wrócić. Aby usunąć wpis w historii, użyj history -d <index>, używając indexnumeru znalezionego w historypoleceniu (pierwsza kolumna).


1
Czy to działa zsh?
Gert

11

Najprostszym sposobem na jednorazowe jest

$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$

gdzie $reprezentuje podpowiedź początkowej powłoki i $$reprezentuje podpowiedź podpowłoki. Działa to w bash i zsh; w ksh potrzebujesz HISTFILE=/notwritablezamiast tego. Zauważ, że liczy się wartość HISTFILEmomentu zapisania pliku historii, a nie wykonanie polecenia. Bash, ksh i zsh zapisują się do pliku historii, gdy wychodzą (zsh może to robić częściej, w zależności od konfiguracji).

Alternatywnie możesz uzyskać bash lub zsh, aby zignorować linie pasujące do określonych wzorców (jest to już objęte innymi odpowiedziami).

Inną możliwością w Zsh jest

% fc -p
% secret-command
% fc -P

fc -pwypycha bieżącą listę historii na stos i uruchamia nową, która nie jest powiązana z plikiem zapisu. fc -Pwyskakuje z niezapisanej historii ze stosu i całkowicie o tym zapomina.

Podczas procesu proces polecenie i jego argumenty (a także w niektórych systemach jego środowisko) pojawią się w tabeli procesów ( pswynik). Root widzi przeszłe polecenia w bazie danych rachunków systemowych i może więcej rejestrować bez twojej kontroli. I prawdopodobnie będą dostępne wszelkiego rodzaju dowody sądowe, które mogą z grubsza pokazać, jakie polecenie wykonałeś (na przykład czasy modyfikacji plików). Więc nie zyskujesz prywatności przed zdeterminowanymi podsłuchami.

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.