Як запобігти появі команд в історії Bash?


93

Іноді, коли я запускаю такі команди, як rm -rf XYZ, я не хочу, щоб це записувалось в історії Bash, оскільки я міг би випадково запустити ту саму команду знову reverse-i-search. Чи є хороший спосіб запобігти цьому?



Хоча він bash може бути використаний для написання сценаріїв оболонки (отже, програмування), але цей його особливий аспект абсолютно не має нічого спільного з програмуванням (історія - це інтерактивна річ). Голосування за закриття.
paxdiablo

Відповіді:


110

Якщо для HISTCONTROLзмінної середовища встановлено значення ignoreboth(яке зазвичай встановлюється за замовчуванням), команди з пробілом, що вводяться, не зберігатимуться в історії (як і дублікати).

Наприклад:

$ HISTCONTROL=ignoreboth
$ echo test1
$  echo test2
$ history | tail -n2
 1015  echo test1
 1016  history | tail -n2

Ось що man bashговорить:

HISTCONTROL

Список значень, відокремлених двокрапкою, що контролюють спосіб збереження команд у списку історії. Якщо список значень включає ignorespace, рядки, які починаються з пробілу, не зберігаються у списку історії . Значення ignoredupsпричин, через які рядки, що відповідають попередньому запису в історії, не зберігаються. Значення ignorebothскорочення для ignorespaceі ignoredups. Значення erasedupsпричин, через які всі попередні рядки, що відповідають поточному рядку, буде видалено зі списку історії, перш ніж цей рядок буде збережено. Будь-яке значення, яке не вказане у наведеному вище списку, ігнорується. Якщо значення HISTCONTROLне встановлено або не містить дійсного значення, усі рядки, прочитані синтаксичним аналізатором оболонки, зберігаються в списку історії за умови значенняHISTIGNORE. Другий та наступні рядки багаторядкової складеної команди не перевіряються і додаються до історії незалежно від значення HISTCONTROL.

Дивитися також:


51

У вашому .bashrc / .bash_profile / куди завгодно, покладіть export HISTIGNORE=' *'. Тоді просто розпочніть будь-яку команду, яку ви хочете проігнорувати, одним пробілом.

$ ls  # goes in history
$  ls # does not

4
Це залежить від значення HISTCONTROLзмінної середовища, яке не обов'язково ignorespaceвстановлено.
sorpigal

3
Якщо HISTCONTROLмістить ignorespace, насправді лише надлишковим є включення `*` в HISTIGNORE. Вони працюють незалежно.
chepner

22

Ще краще використовувати HISTIGNORE. Це дозволяє вказати набір шаблонів, які слід ігнорувати (наприклад rm). Це краще (я думаю), ніж просто прокладати всю історію /dev/null.


Ах, так, забув про це :)
Корі Хендерсон,

13
kill -9 $$

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

Це швидкий спосіб, і щось на зразок стирання файлу історії не є настільки хорошим, оскільки вам потрібно робити це за межами оболонки збереження історії (увійдіть як інший користувач і використовуйте su / sudo, створюючи фонове завдання тощо)


8

Ви можете зробити одне з двох:

export HISTFILE=/dev/null

Або розпочніть команду з пробілу.


5
простір перед тим, що це чудово
Ерік Фортіс

8
Деякі з нас вважають, що автоматичне ігнорування команд з префіксом пробілу є насправді поганою ідеєю, і тому не ignorespaceвстановлено за замовчуванням.
сорпігаль

3
Встановлення HISTFILEцього способу запобігає збереженню будь-якої історії та не заважає додаванню команди до історії в пам'яті.
Чепнер

3

Або

unset HISTFILE

(схоже на попередню відповідь, лише коротше: експортувати HISTFILE = / dev / null)


1
Це впливає лише на історію на диску, а не на історію в пам'яті.
chepner

2

Під час запуску оболонки я чітко очищаю історію від записів, які я не хочу там знаходити. Наприклад, я не хочу жодного rm -rfв історії (це травма після видалення каталогу, повного результатів, оброблених за ніч, лише з одним Arrow-Up+ Enter:)

Я помістив наступний фрагмент у свій файл init (працює з .zshrc, повинен також працювати .bashrc)

# ...
HISTFILE=~/.zshhistory
# ...

# remove dangerous entries from the shell history
temp_histfile="/tmp/$$.temp_histfile"
grep -v -P '^rm .*-rf' $HISTFILE > $temp_histfile
mv $temp_histfile $HISTFILE
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.