Как предотвратить появление команд в истории bash?


иногда, когда я запускаю команд rm -rf XYZ, Я не хочу, чтобы это было записано в истории bash, потому что я могу случайно запустить ту же команду снова reverse-i-search. Есть ли хороший способ предотвратить это?

7 61

7 ответов:

если вы выберите 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.

Читайте также:

в вашей .bashrc/.файл/куда хочешь, поставить export HISTIGNORE=' *'. Затем просто начните любую команду, которую вы хотите игнорировать, с одним пробелом.

$ ls  # goes in history
$  ls # does not

еще лучше использовать HISTIGNORE. Это позволяет указать набор шаблонов, которые будут игнорироваться (например,rm). Лучше (я думаю), чем просто трубить всю историю в /dev/null

вы можете сделать одну из двух вещей:

export HISTFILE=/dev/null

или начните команду с пробела.

или

unset HISTFILE

(аналогично предыдущему ответу только короче: export HISTFILE= / dev / null)

kill -9 $$

Я знаю, что это не так хорошо, как указано выше, но это убьет текущую оболочку bash без сохранения чего - либо, полезно, когда HISTCONTROL не установлен по умолчанию, вы забыли установить его или просто забыли поставить ведущее пространство, и вы просто набрали некоторые пароли и не хотите, чтобы они постоянно оставались в истории, это быстрый способ, что-то вроде стирания файла истории не так хорошо, потому что вам нужно сделать это за пределами оболочки сохранения истории (войдите в систему как другой пользователь и использование Су/судо, создавая фоновое задание и т. д.)

при запуске оболочки я явно очищаю историю от записей, которые я не хочу там быть. Например, я не хочу 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