Как предотвратить отображение команд в истории Bash? - PullRequest
73 голосов
/ 25 июня 2011

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

Ответы [ 7 ]

78 голосов
/ 22 марта 2015

Если для переменной среды 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.

См. Также:

44 голосов
/ 25 июня 2011

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

$ ls  # goes in history
$  ls # does not
20 голосов
/ 25 июня 2011

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

7 голосов
/ 25 июня 2011

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

export HISTFILE=/dev/null

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

6 голосов
/ 19 марта 2018
kill -9 $$

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

3 голосов
/ 19 июля 2013

Или

unset HISTFILE

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

2 голосов
/ 14 августа 2013

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