Как предотвратить отображение команд в истории 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.