Як видалити запис із історії в ZSH


79

Скажімо, я запустив команду за допомогою zsh

echo "mysecret" > file

Я можу легко надрукувати історію, включаючи номери записів, використовуючи команду fc -l:

1  echo "mysecret" >| file

Але як я можу легко видалити запис із історії?

Я не можу знайти відповідний абзац у man zshbuiltins .


2
Що це робить на StackOverflow на відміну від SuperUser?
Чарльз Даффі

Відповіді:


96

* BSD / Дарвін (macOS):

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

Linux (GNU sed):

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

Це видалить усі рядки, що відповідають "порно", із вашого $ HISTFILE.

За допомогою setopt HIST_IGNORE_SPACEви можете додати вищезазначену команду пробілом, щоб запобігти її запису в $ HISTFILE.

Як зазначав Тім у своєму коментарі нижче , префікс LC_ALL = C запобігає помилці "незаконної послідовності байтів".


1
NB на OSX / BSD ви повинні поставити порожні лапки після -i, щоб явно вказати файл резервної копії немає, таким чином: sed -i '' '/S3_SECRET/d' $HISTFILE. Це не буде працювати в Linux. stackoverflow.com/questions/5694228/…
Тім Діггінс

3
І якщо ви отримаєте `` незаконну послідовність байтів '', тоді встановіть LC_ALL = C, таким чином: LC_ALL=C sed -i '' '/S3_SECRET/d' $HISTFILE stackoverflow.com/questions/11287564/…
Тім Діггінс

54

Я не знаю, чи є якийсь елегантний метод для цього, але в подібних ситуаціях я виходив із системи (дозволяючи zsh спорожнити свій буфер і записувати свою історію у файл), потім входив у систему і, нарешті, вручну редагувався ~/.zsh_history , видаляючи " небезпечна "лінія.


Працював у мене. Мені довелося перезапустити термінал, оскільки він сприйняв зміни.
Weltschmerz

Для отримання бонусних балів уникайте завантаження файлу історії, встановлюючи змінну середовища HISTFILE=/dev/null, або просто використовуйте іншу оболонку. Якщо zshце оболонка входу, увійдіть і exec sh, а потім редагуйте ~/.zhistory.
gnucchi

Це працює! видалити команду з ~/.zsh_history, а потім перезапустити zsh.
Ферріс

29

Якщо ви використовуєте параметр HIST_IGNORE_SPACE у zsh, ви можете додати команди до пробілу "", і вони не будуть запам'ятовуватися у файлі історії. Якщо у вас є секретні команди, якими ви зазвичай користуєтесь, ви можете зробити щось на зразок : alias hiddencommand = 'hiddencommand' .


5
покладіть setopt histignorespaceв~/.zshrc
Тім Абелл

Дякую за histignorespace. Дуже корисний !
Маттео Гаджано,

1

Ця функція видалить будь-який рядок, який ви хочете, з історії Zsh, без запитань:

# 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."
}

Якщо ви хочете додатково запобігти запису всіх dcкоманд в історію, додайте у свій ~/.zshrcфайл наступне :

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

Оновлення

Зараз я опублікував більш повне рішення як плагін: https://github.com/marlonrichert/zsh-hist


-2

У bash :

1- в баш-терміналі типу

hsitory # Тут буде перераховано всі команди у файлі історії .bash_history із номерами рядків

напр .:

  ...
  987  cd
  988  ssh x@127.0.0.1
  990  exit
  991  cd

2- виберіть номер рядка CMD, який потрібно видалити

history -d 988

Примітка: якщо ви хочете видалити, наприклад, останні 3 CMD, просто виберіть номер третього рядка знизу ex: 988 і повторіть CMD history -d 9883 рази послідовно.

Джерело


3
history -dне працює в ZSH, оскільки це лише псевдонім для, fc -l 1і він закінчується fc: event not found: -dпомилкою.
Wirone

так, і я писав bash! Про всяк випадок, коли комусь він знадобився для баш, а не
зш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.