Иногда, когда я запускаю такие команды, как rm -rf XYZ, я не хочу, чтобы это записывалось в истории Bash, потому что я мог бы случайно запустить эту же команду снова с помощью reverse-i-search. Есть ли хороший способ предотвратить это?
Как предотвратить отображение команд в истории Bash?
Ответ 1
Если вы установили переменную среды 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.
См. также:
Ответ 2
В вашем .bashrc/.bash_profile/где угодно, поставьте export HISTIGNORE=' *'. Затем просто начните любую команду, которую вы хотите игнорировать с одним пробелом.
$ ls # goes in history
$ ls # does not
Ответ 3
Еще лучше использовать HISTIGNORE. Это позволяет указать набор шаблонов, которые необходимо игнорировать (например, rm). Лучше (я думаю), чем просто проложить всю историю до /dev/null
Ответ 4
Вы можете сделать одну из двух вещей:
export HISTFILE=/dev/null
Или, начните команду с пробела.
Ответ 5
kill -9 $$
Я знаю, что это не так хорошо, как выше, но это убьет текущую оболочку bash без сохранения чего-либо, полезно, когда HISTCONTROL не установлен по умолчанию, вы забыли установить его или просто, вы забыли поставить начальный пробел и просто введите некоторые пароли и не хотите, чтобы они оставались в истории навсегда, это быстрый способ, что-то вроде удаления файла истории не так хорошо, потому что вам нужно сделать это вне оболочки сохранения истории (войдите под другим пользователем и использовать su/sudo, создание фоновой работы и т.д.)
Ответ 6
или
unset HISTFILE
(аналогично предыдущему ответу только короче: export HISTFILE =/dev/null)
Ответ 7
При запуске оболочки я явно очищаю историю от записей, которые я не хочу быть там. Например, мне не нужна никакая rm -rf в истории (это травма после удаления каталога, полного результатов, обработанных за одну ночь, только с помощью одного Arrow-Up + Enter:)
Я помещаю следующий фрагмент в мой файл инициализации (работает с .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