Jak usunąć wpis z historii w ZSH

79

Powiedzmy, że uruchomiłem polecenie przy użyciu zsh

echo "mysecret" > file

Mogę łatwo wydrukować historię wraz z numerami wpisów za pomocą polecenia fc -l:

1  echo "mysecret" >| file

Ale jak mogę łatwo usunąć wpis z historii?

Nie mogę znaleźć odpowiedniego akapitu w man zshbuiltins .

sandoz
źródło
2
Co to robi w StackOverflow w przeciwieństwie do SuperUser?
Charles Duffy

Odpowiedzi:

96

* BSD / Darwin (macOS):

LC_ALL=C sed -i '' '/porn/d' $HISTFILE

Linux (GNU sed):

LC_ALL=C sed -i '/porn/d' $HISTFILE

Spowoduje to usunięcie wszystkich wierszy pasujących do słowa „porn” z pliku $ HISTFILE.

Używając setopt HIST_IGNORE_SPACE, możesz poprzedzić powyższe polecenie znakiem spacji, aby zapobiec zapisaniu go do $ HISTFILE.

Jak zauważył Tim w swoim komentarzu poniżej , przedrostek LC_ALL = C zapobiega niepowodzeniu „niedozwolonej sekwencji bajtów”.

rxw
źródło
1
Uwaga na OSX / BSD trzeba umieścić pustych cytaty po -i jawnie określić plik kopii zapasowej, w następujący sposób: sed -i '' '/S3_SECRET/d' $HISTFILE. To nie zadziała na Linuksie. stackoverflow.com/questions/5694228/…
Tim Diggins
3
A jeśli otrzymasz „niedozwoloną sekwencję bajtów”, ustaw LC_ALL = C, w ten sposób: LC_ALL=C sed -i '' '/S3_SECRET/d' $HISTFILE stackoverflow.com/questions/11287564/ ...
Tim Diggins
54

Nie wiem, czy istnieje jakaś elegancka metoda na zrobienie tego, ale w podobnych sytuacjach wylogowałem się (pozwalając zsh opróżnić swój bufor i zapisać moją historię do pliku), zalogowałem się i ostatecznie ręcznie edytowałem ~/.zsh_history , usuwając " niebezpieczna ”.

poplitea
źródło
Pracował dla mnie. Musiałem zrestartować mój terminal, ponieważ odebrał zmiany.
weltschmerz
Aby uzyskać dodatkowe punkty, unikaj ładowania pliku historii przez ustawienie zmiennej środowiskowej HISTFILE=/dev/nulllub po prostu użyj innej powłoki. Jeśli zshjest to powłoka logowania, zaloguj się exec sh, a następnie edytuj ~/.zhistory.
gnucchi
To działa! usuń polecenie z ~/.zsh_history, a następnie uruchom ponownie zsh.
Ferris
29

Jeśli używasz opcji HIST_IGNORE_SPACE w zsh, możesz poprzedzać polecenia spacją „” i nie zostaną one zapamiętane w pliku historii. Jeśli masz tajne polecenia, których często używasz, możesz zrobić coś w następujący sposób: alias hiddencommand = 'hiddencommand' .

Michael Barton
źródło
5
umieść setopt histignorespaceswoje~/.zshrc
Tim Abell
Dzięki za histignorespace. Bardzo przydatne !
Matteo Gaggiano,
1

Ta funkcja usunie dowolną linię z historii Zsh, bez zadawania pytań:

# Accepts one history line number as argument.
# Alternatively, you can do `dc -1` to remove the last line.
dc () {
  # Prevent the specified history line from being saved.
  local HISTORY_IGNORE="${(b)$(fc -ln $1 $1)}"

  # Write out the history to file, excluding lines that match `$HISTORY_IGNORE`.
  fc -W

  # Dispose of the current history and read the new history from file.
  fc -p $HISTFILE $HISTSIZE $SAVEHIST

  # TA-DA!
  print "Deleted '$HISTORY_IGNORE' from history."
}

Jeśli chcesz dodatkowo uniemożliwić dczapisywanie wszystkich poleceń w historii, dodaj w swoim ~/.zshrcpliku:

zshaddhistory() {
 [[ $1 != 'dc '* ]]
}

Aktualizacja

Opublikowałem teraz bardziej kompleksowe rozwiązanie jako wtyczkę: https://github.com/marlonrichert/zsh-hist

Marlon Richert
źródło
-2

W bash :

1- w typie terminala bash

hsitory # Spowoduje to wyświetlenie wszystkich poleceń w pliku historii .bash_history z numerami wierszy

dawny:

  ...
  987  cd
  988  ssh [email protected]
  990  exit
  991  cd

2 - wybierz numer linii CMD, którą chcesz usunąć

history -d 988

Uwaga: jeśli chcesz usunąć na przykład ostatnie 3 CMD, po prostu wybierz numer trzeciego wiersza od dołu, np .: 988 i powtórz CMD history -d 9883 razy w kolejności.

Źródło

KhogaEslam
źródło
3
history -dnie działa w ZSH bo to tylko alias dla fc -l 1i kończy się fc: event not found: -dbłędem.
Wirone
tak, i napisałem w bash! Na wypadek, gdyby ktoś potrzebował go do bash nie zsh
KhogaEslam