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

96

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

Джиён Ким
источник
1
serverfault.com/questions/48769/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Хотя 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.

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

Kenorb
источник
53

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

$ ls  # goes in history
$  ls # does not
Rhdoenges
источник
4
Это зависит от значения HISTCONTROLпеременной окружения, которое не обязательно ignorespaceустановлено.
sorpigal
3
Если он HISTCONTROLсодержит ignorespace, на самом деле избыточно только включать `*` в HISTIGNORE. Оба работают независимо.
chepner
22

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

bmatheny
источник
Ах да, забыл об этом :)
Кори Хендерсон
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
Якуб М.
источник