почему удаление истории bash недостаточно?

15

Раньше я думал, что удаления моей истории bash было достаточно, чтобы очистить мою историю bash, но вчера моя кошка бездельничала вокруг правой стороны моей клавиатуры, и когда я вернулся в свой компьютер, я увидел что-то, что я напечатал месяц назад, затем я начал нажмите все клавиши как сумасшедшие, ища то, что могло вызвать это. Оказывается, клавиша UPARROW показывает мою историю bash даже после удаления .bash_history.

Как я могу удалить мою историю Bash на самом деле?

bunden
источник
8
.bash_history перезаписывается каждый раз, когда вы закрываете оболочку bash. Поэтому, если вы запустите bash, удалите .bash_history и выйдете из системы, вы ничего не добьетесь.
Шадур
14
Ваша кошка заслуживает огромной награды. Вы использовали Баш для как долго , не обнаружив у него есть командная строка вспомнить и редактирование? Вы просто перепечатываете каждую командную строку с нуля каждый раз или что-то? Это сделало бы оболочку очень неприятной в использовании.
Cas
@cas десять лет. Теперь, когда вы это говорите, я нажимаю клавишу «Вверх», чтобы повторять команды, но я понимал это как «кратковременную» память длиной не более нескольких строк. Я не был предупрежден, что удаление .bash_history не удалит историю bash.
Бунден
Удаление ~/.bash_historyдействительно удаляет ~/.bash_history.... но (если вы не предпримете шаги, чтобы предотвратить это, например очистите историю в памяти, запустив ее history -cнепосредственно перед выходом из системы или установкой HISTFILE=/dev/nullили просто unsetдобавив ее), bash просто сохранит свою текущую историю снова, когда выйдет . Кстати, HISTSIZEenv var сообщает bash, сколько строк истории следует сохранить в памяти, и HISTFILESIZEсообщает bash максимальное количество сохраняемых строк истории. оба из них могут быть установлены, например, в вашем ~/.bashrc. PS: ваша кошка заслуживает 2-й награды за то, что преподнесла вам ценный урок :)
cas
@cas Я думаю, что удаление .bash_history должно удалить историю Bash. Это кажется мне интуитивным. То, что не кажется интуитивным, это история -c, история -w, сброс переменных ... это просто с точки зрения пользовательского опыта.
Бунден

Ответы:

26

В некоторых случаях (в некоторых версиях bash) выполните:

$ history -c; history -w

Или просто

$ history -cw

Очистит историю в памяти (у стрелок вверх и вниз не будет команд для отображения в списке), а затем запишет это в $HISTFILEфайл (если он $HISTFILEусекается запущенным экземпляром bash).

Иногда bash выбирает не обрезать $HISTFILEфайл, даже если histappendопция не установлена ​​и $HISFILEZIZEустановлена ​​в 0.

В таких случаях опция nuke всегда работает:

history -c; >$HISTFILE

Это очистит список истории команд, записанных в памяти, и всех команд, ранее записанных в файл. Это обеспечит отсутствие в запущенной оболочке записанной истории ни в памяти, ни на диске, однако другие запущенные экземпляры bash (где активна история) могут иметь полную копию команд, считанных с $HISTFILEмомента запуска bash (или когда history -rвыполняется a ) ,

Если также требуется, чтобы ничто другое (без новых команд) текущего сеанса было записано в файл истории, то unset HISTFILEэто предотвратит любую такую ​​регистрацию.

Исаак
источник
1
Редактирование HISTFILE и выполнение history -c && history -rзаменит вашу текущую историю вручную измененной историей. В некоторых случаях это может быть лучше, чем выбрасывать всю историю.
Микко Ранталайнен,
9

bashимеет историю сеанса в памяти, которая записывается в файл, если для переменной оболочки HISTFILEзадано имя файла при bashвыходе.

Если вы удалите файл, на который указывает указатель, удалите HISTFILEэту переменную и bashвыйдете, этот сеанс оболочки не оставит никакой постоянной истории.

Если не сбросить HISTFILEпеременную, а удалить файл, то будет просто очищена постоянная история, но история текущей сессии будет сохранена при выходе из оболочки.

Кусалананда
источник
3
A history -c; history -wочистит память и историю файлов. Отключение HISTFILE требуется только в том случае, если в историю не нужно записывать дальнейшие команды (не совсем то, что было задано IMhO).
Исаак
-1

"Как я могу удалить мою историю bash на самом деле?"

Выйдите из bash, запустите другую оболочку, удалите файл истории bash.

или

Выйдите из системы, войдите в другую учетную запись с правами на запись в файл истории, удалите файл истории.

пользователь
источник
-2

Оставляя оболочку, делайте все за один раз, как

echo "" > ~/.bash_history && history -c && exit
user853069
источник
@roaima, ты совершенно прав, спасибо. Исправленный.
user853069