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


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.