Як видалити єдиний рядок з історії?


202

Я працюю в Mac OSX, тож я думаю, що я використовую bash ...?

Іноді я ввожу щось, про що не хочу, щоб його пам’ятали в історії. Як її видалити?


Відповіді:


338

Профілактичні заходи

Якщо ви хочете запустити команду, не зберігаючи її в історії, додайте їй додаткове місце

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 Сім,

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

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. знову увійти: запис все ще є. Залежно від того, як ви налаштовуєте історію баш, можливо, ви можете відтворити цю проблему іншими способами, тобто, якщо ви провокуєте писати історію перед виходом із системи.
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

Будь-який шанс хтось міг допомогти з Portin це zshell?
Alex S

6

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


2
Швидше за все, ці записи будуть знову введені, коли ви виходите з оболонки.
l0b0

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.