Как удалить одну строку из истории?


202

Я работаю в Mac OSX, поэтому я думаю, что я использую Bash ...?

Иногда я вхожу в то, что не хочу, чтобы меня запомнили в истории. Как мне это убрать?


Ответы:


340

Профилактические меры

Если вы хотите выполнить команду, не сохраняя ее в истории, добавьте ее с дополнительным пробелом

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Чтобы это работало, вам нужно либо в, ignorespaceлибо ignorebothв HISTCONTROL. Например, запустить

HISTCONTROL=ignorespace

Чтобы сделать этот параметр постоянным, поместите его в свой .bashrc.

Посмертная уборка

Если вы уже выполнили команду и хотите удалить ее из истории, сначала используйте

history

отобразить список команд в вашей истории. Найдите номер рядом с тем, который вы хотите удалить (например, 1234), и запустите

history -d 1234

Кроме того, если строка, которую вы хотите удалить, уже записана в ваш $ HISTFILE (что обычно происходит, когда вы завершаете сеанс по умолчанию), вам нужно будет выполнить обратную запись в $ HISTFILE, или эта строка появится снова, когда вы откроете новую сессия:

history -w

Это сработало. Я думаю, что мы должны получить исходный текст ~ / .bashrc после его изменения ...
B 7

3
@ jw013 Я установил PROMPT_COMMAND history -aв этом случае, в этом случае он уже записан в файл истории, а не при выходе при нормальной конфигурации. В частности: mywiki.wooledge.org/BashFAQ/088
Иордания

5
После удаления одной строки вам нужно записать текущую историю в ваш $ HISTFILE, используя history -w. В противном случае при выходе удаленная строка все еще там!
Фелипе Альварес

1
+1 к комментарию выше; использование history -wafter history -d {num}было именно тем, что мне было нужно - этот критический лакомый кусочек должен быть добавлен к ответу, иначе пользователь может подумать, что временное удаление из текущей оболочки на самом деле является постоянным.
Майкл

1
@BobStein history -wнеобходим для записей, которые уже были записаны в .bash_historyфайл. Как воспроизвести (например, на CentOS 7 со стандартной конфигурацией): 1. войдите 2. введите команду echo foo3. выйдите из системы 4. снова войдите в систему 5. удалите запись для echo foo6. выйдите из системы 7. снова войдите в систему: запись все еще там. В зависимости от того, как вы конфигурируете свою историю Bash, возможно, вы можете воспроизвести эту проблему другими способами - например, если вы провоцируете запись истории перед выходом из системы.
maxschlepzig

53
  1. Чтобы очистить всю свою историю, используйте

    history -c
  2. Чтобы удалить одну строку, используйте

    history -d linenumber

6

У меня есть это в моем ~/.bashrc, что делает команду $ forgetудалить предыдущую команду из истории

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}

Это кажется немного сложным. Не history -d $( history | tail -n 1 | cut -f 1 -d " " )будет проще?
seumasmac

1
history | tail -n1является самой historyкомандой, поэтому удаление этого номера приводит к неправильной записи. Тем не менее, history -d $( history | awk 'END{print $1-1}' )объединяет выбор линии, выбор поля и вычитание.
dave_thompson_085

Есть ли шанс, что кто-то может помочь с портированием этого на zshell?
Алекс С

6

Вы всегда можете редактировать и удалять записи ~/.bash_history, полезно, когда вы хотите удалить одну запись или более одной записи


2
Скорее всего, эти записи будут повторно введены при выходе из оболочки.
10

5

Если вы хотите забыть весь сеанс bash, вы можете killиспользовать текущий процесс bash. Поскольку переменная $$содержит pidтекущую оболочку, вы можете сделать:

kill -9 $$

1

Вам нужно написать изменения после того, как вы очистили историю. И если вы не хотите, чтобы в вашей истории была команда стереть историю, вам нужно выполнить такую ​​команду:

history -c && history -w && logout

Удачи.


-1
Adding another point suppose if you want to delete a range of history lines

You can use below script. 

Below example will delete history output from line 1 to line 150.

for i in `history | awk 'NR > 1 && NR <=150{print   $1}'`; do history -d $i; done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.