Иногда, когда я запускаю такие команды, как 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