Как предотвратить отображение команд в истории Bash?


96

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



Хотя bash может использоваться для написания сценариев оболочки (следовательно, программирования), этот конкретный аспект не имеет абсолютно ничего общего с программированием (история - это только интерактивная вещь). Голосование закрыто.
paxdiablo

Ответы:


114

Если вы установили для 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.

Смотрите также:


53

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

$ ls  # goes in history
$  ls # does not

4
Это зависит от значения HISTCONTROLпеременной окружения, которое не обязательно ignorespaceустановлено.
sorpigal

3
Если он HISTCONTROLсодержит ignorespace, на самом деле избыточно только включать `*` в HISTIGNORE. Оба работают независимо.
chepner

22

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


Ах да, забыл об этом :)
Кори Хендерсон

13
kill -9 $$

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

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


8

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

export HISTFILE=/dev/null

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


5
место до этого потрясающе
Эрик Фортис

8
Некоторые из нас думают, что автоматическое игнорирование команд с префиксом пробела - это действительно плохая идея, и поэтому они не ignorespaceустановлены по умолчанию.
sorpigal

3
Установка HISTFILEТаким образом предотвращает хранение любой истории, и не мешает команду от добавления к истории в памяти.
chepner

3

Или

unset HISTFILE

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


1
Это влияет только на историю на диске, но не на историю в памяти.
chepner

2

При запуске оболочки я явно очищаю историю от записей, которые мне не нужны. Например, я не хочу ничего 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.