Как удалить запись из истории в ZSH

79

Допустим, я выполнил команду с помощью zsh

echo "mysecret" > file

Я могу легко распечатать историю, включая номера записей, с помощью команды fc -l:

1  echo "mysecret" >| file

Но как мне легко удалить запись из истории?

Я не могу найти соответствующий абзац в man zshbuiltins .

Sandoz
источник
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

Это приведет к удалению всех строк, соответствующих слову "porn" из вашего $ HISTFILE.

С помощью setopt HIST_IGNORE_SPACE, вы можете добавить к указанной выше команде пробел, чтобы предотвратить ее запись в $ HISTFILE.

Как Тим указал в своем комментарии ниже , префикс LC_ALL = C предотвращает сбой «недопустимой последовательности байтов».

rxw
источник
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 03
Для получения бонусных баллов избегайте загрузки файла истории, задав переменную среды HISTFILE=/dev/null, или просто используйте другую оболочку. Если zshэто оболочка входа в систему, войдите и exec shзатем отредактируйте ~/.zhistory.
gnucchi
Это действительно работает! удалить команду из ~/.zsh_history, а затем перезапустить zsh.
Ferris
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- в терминальном типе bash

hsitory # Это перечислит все команды в файле history .bash_history с номерами строк

пример:

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

2- выберите номер строки CMD, которую вы хотите удалить

history -d 988

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

Источник

ХогаЭслам
источник
3
history -dне работает в ZSH, потому что это всего лишь псевдоним для fc -l 1и заканчивается fc: event not found: -dошибкой.
Wirone
да и я на баше написал! На всякий случай, если кому-то это нужно для bash, а не zsh
KhogaEslam