Видалення історії з ~ / .bash_history


8

У мене є кілька запитань про історію терміналу або командного рядка, яка зберігається в ~/.bash_history.

  1. Я бачу файл у терміналі з historyкомандою, але якщо я спробую відкрити його з gedit bash_historyфайлом, він повністю порожній. Чому?

  2. Я знайшов, як видалити певну кількість рядків у файлі з терміналу за допомогою цього рядка коду:

    for i in {1..N}; do history -d N; done

    де N - кількість рядків (або команд), які ви хочете видалити, але тепер файл історії показує цю останню команду, і це не дуже розумно, якщо ви намагаєтесь висвітлити свої речі. Отже, питання полягає в тому, як я можу дати останній рядок коду і переконатися, що він не записується?



Для майбутньої примітки, якщо ви запускаєте будь-яку команду з пробілу, ця команда не буде збережена у вашій історії.
Падді Ландау

Відповіді:


18
  1. Ви просто забули попередню крапку, команда відкрити файл (bash) терміналу історії є

    gedit ~/.bash_history

    Цей файл оновлюється лише після закриття терміналу.

  2. Щоб видалити останні 10 рядків з цього файлу і не записати цю команду, відкрийте новий термінал і виконайте наступну ланцюжок команд:

    sed -n -e :a -e '1,10!{P;N;D;};N;ba' ~/.bash_history && history -c && exit

    або

    for i in {1..10}; do sed -i '$d' ~/.bash_history; done && history -c && exit

    або

    head -n -10 ~/.bash_history > ~/.b_h_2 && mv ~/.b_h_2 ~/.bash_history && history -c && exit

    sedабо headвідповідно видаляє вибрані рядки з ~/.bash_history, history -cочищає історію терміналу і exitзакриває його.


Коротка та, сподіваємось, швидша альтернатива for+ sed: head -n -Nде великі регістри N- це кількість рядків, які потрібно видалити. stackoverflow.com/a/13380679/711006
Melebius

2
@Melebius Виглядає перспективно, але як ви перенаправляєте вихід на вхідний файл, перезаписуючи його? head -n -N testfile > testfileпросто очищає файл! Я додав обхід, але це, звичайно, не коротше.
десерт

Ви маєте рацію, я забув, що headне може працювати на місці sed. Я в першу чергу шукав одну sedкоманду, яка замінила ваш forцикл. На сторінці, яку я пов’язав, є кілька варіантів, але вони виглядають не так зрозуміло, як ваш код.
Мелебій

@Melebius Дивіться для цього sed1line.txt - я додав його вище, він не дуже коротший, але повинен бути швидшим.
десерт

4

Файл bash_history - це прихований файл, починаючи з крапки. Вам потрібно зробити

gedit ~/.bash_history

Це відкриє файл у gedit.


1

Якщо ви хочете видалити лише певні частини вашого журналу команд, перераховані вище методи просто чудові. Якщо ви хочете зупинити реєстрацію команд для певного сеансу bash, тоді видайте команду

unset HISTFILE

Щоб бути більш різким, якщо ви не хочете, щоб будь-яка ваша команда була зареєстрована , ви можете зробити це

rm ~/.bash_history
ln -s /dev/null ~/.bash_history

Зауважте, що перший метод діятиме лише для одного сеансу, тоді як другий метод зупинятиме журнал команд для всіх майбутніх сеансів.


1

Я усвідомлюю, що це вже є прийнятою відповіддю, але саме так я робив це з 80-х. Це прекрасний спосіб приховати свої доріжки і це багатофазний підхід. Здебільшого його не помічають, якщо на нього не звернути уваги. Ось як це робиться.

Відкрийте термінал / оболонку / сеанс і виконайте:

 chmod 444 ~/.bash_history

вийдіть з оболонки, відкрийте термінал / оболонку / сеанс і виконайте: Ось кілька творчих способів назавжди стерти історію

1:

 vi ~/.bash_history
 9999999 dd
 <esc>wq!

2 (створити підроблену історію)

 sudo echo "which ls" > ~/.bash_history
 sudo echo "cd ~/;ls" >> ~/.bash_history

то для гарної міри:

 chmod 444 ~/.bash_history

вийти з оболонки

відкрийте нову оболонку та введіть

 history

те, що робить його менш помітним, це якщо ls -ratl, ~ / .bash_history з часом зникне в брязкальці списку каталогів. Він не відображатиметься як посилання, яке приверне зайву увагу. Більшість людей не роблять -а на корені, що корисно, коли бажана емуляція.

Недоліком цього підходу є те, що ви втрачаєте здатність повертатися назад та отримувати історію. власне файл ~ / .bash_history також може закінчитися у верхній частині списку каталогів, оскільки він може закінчитися дійсно старою датою модифікації з часом, що саме по собі може призвести до виявлення того, що щось не так.


якщо ви 9999999 ddвидаляєте всі рядки з файлу :%d, :1,$dабо dGпрацюєте набагато краще
phuclv

0

1) Бігати sh; це породжує нижню частину золи, яка взагалі не записує історію. Редагувати звідти

2) Додайте рядок HISTCONTROL=ignorebothдо .bashrcта виконайте exec bashпостійну заміну поточної оболонки на реініціалізовану, а потім виконайте всі команди, які ви не хочете, щоб увійшли з провідним пробілом.


0

оскільки я поки не можу коментувати, додаю свої коментарі як відповідь:

man history відповість на все це.

Відповідь на №1 полягає в тому, що історія на пам’яті. history -aзберегти у файл негайно. history -wтакож збереже, але може зіпсувати інші сеанси.

відповідь №2:, history -agedit, видаліть потрібні рядки,history -r


0

Історія не зберігається, поки ви не вийдете з оболонки. Спробуйте вийти з оболонки, а потім знову подивіться на .bash_history. Історія команд повинна бути там.


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