Как предотвратить отображение команд в истории Bash?
96
Иногда, когда я запускаю такие команды, как rm -rf XYZ, я не хочу, чтобы это записывалось в истории Bash, потому что я могу случайно запустить ту же команду снова,reverse-i-search . Есть ли хороший способ предотвратить это?
Хотя bashможет использоваться для написания сценариев оболочки (следовательно, программирования), этот конкретный аспект не имеет абсолютно ничего общего с программированием (история - это только интерактивная вещь). Голосование закрыто.
Если вы установили для HISTCONTROLпеременной среды значение ignoreboth(которое обычно устанавливается по умолчанию), команды с начальным пробелом не будут сохраняться в истории (как и дубликаты).
Список значений, разделенных двоеточиями, определяющих, как команды сохраняются в списке истории. Если список значений включает ignorespace, строки, начинающиеся с символа пробела, не сохраняются в списке истории . Значение ignoredupsзаставляет строки, соответствующие предыдущей записи в истории, не сохраняться. Значение ignorebothявляется сокращением для ignorespaceи ignoredups. Значение erasedupsзаставляет все предыдущие строки, соответствующие текущей строке, удаляться из списка истории до того, как эта строка будет сохранена. Любое значение, не указанное в приведенном выше списке, игнорируется. Если не задано HISTCONTROLили не включает допустимое значение, все строки, прочитанные синтаксическим анализатором оболочки, сохраняются в списке истории, в зависимости от значенияHISTIGNORE . Вторая и последующие строки многострочной составной команды не тестируются и добавляются в историю независимо от значения HISTCONTROL.
В вашем .bashrc / .bash_profile / где хотите, поместите export HISTIGNORE=' *'. Затем просто начните любую команду, которую хотите игнорировать, с одного пробела.
Это зависит от значения HISTCONTROLпеременной окружения, которое не обязательно ignorespaceустановлено.
sorpigal
3
Если он HISTCONTROLсодержит ignorespace, на самом деле избыточно только включать `*` в HISTIGNORE. Оба работают независимо.
chepner
22
Даже лучше использовать HISTIGNORE. Это позволяет вам указать набор шаблонов, которые следует игнорировать (например, rm). Это лучше (я думаю), чем просто передавать всю историю по конвейеру /dev/null.
Я знаю, что это не так хорошо, как предыдущие ответы, но это убьет текущую оболочку Bash без сохранения чего-либо, полезно, когда HISTCONTROL не установлен по умолчанию, вы забыли его установить или просто и просто вы забыли поставить начальный пробел и вы только что ввели пароли и не хотите, чтобы они навсегда остались в истории.
Это быстрый способ, и что-то вроде удаления файла истории не так хорошо, потому что вам нужно делать это вне оболочки сохранения истории (войдите в систему как другой пользователь и используйте su / sudo, создав фоновое задание и т. Д.)
Некоторые из нас думают, что автоматическое игнорирование команд с префиксом пробела - это действительно плохая идея, и поэтому они не ignorespaceустановлены по умолчанию.
sorpigal
3
Установка HISTFILEТаким образом предотвращает хранение любой истории, и не мешает команду от добавления к истории в памяти.
chepner
3
Или
unset HISTFILE
(аналогично предыдущему ответу, только короче: export HISTFILE = / dev / null)
Это влияет только на историю на диске, но не на историю в памяти.
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
bash
может использоваться для написания сценариев оболочки (следовательно, программирования), этот конкретный аспект не имеет абсолютно ничего общего с программированием (история - это только интерактивная вещь). Голосование закрыто.Ответы:
Если вы установили для
HISTCONTROL
переменной среды значениеignoreboth
(которое обычно устанавливается по умолчанию), команды с начальным пробелом не будут сохраняться в истории (как и дубликаты).Например:
$ HISTCONTROL=ignoreboth $ echo test1 $ echo test2 $ history | tail -n2 1015 echo test1 1016 history | tail -n2
Вот что
man bash
говорит:Смотрите также:
источник
В вашем .bashrc / .bash_profile / где хотите, поместите
export HISTIGNORE=' *'
. Затем просто начните любую команду, которую хотите игнорировать, с одного пробела.$ ls # goes in history $ ls # does not
источник
HISTCONTROL
переменной окружения, которое не обязательноignorespace
установлено.HISTCONTROL
содержитignorespace
, на самом деле избыточно только включать `*` вHISTIGNORE
. Оба работают независимо.Даже лучше использовать
HISTIGNORE
. Это позволяет вам указать набор шаблонов, которые следует игнорировать (например,rm
). Это лучше (я думаю), чем просто передавать всю историю по конвейеру/dev/null
.источник
kill -9 $$
Я знаю, что это не так хорошо, как предыдущие ответы, но это убьет текущую оболочку Bash без сохранения чего-либо, полезно, когда HISTCONTROL не установлен по умолчанию, вы забыли его установить или просто и просто вы забыли поставить начальный пробел и вы только что ввели пароли и не хотите, чтобы они навсегда остались в истории.
Это быстрый способ, и что-то вроде удаления файла истории не так хорошо, потому что вам нужно делать это вне оболочки сохранения истории (войдите в систему как другой пользователь и используйте su / sudo, создав фоновое задание и т. Д.)
источник
Вы можете сделать одно из двух:
export HISTFILE=/dev/null
Или начните команду с пробела.
источник
ignorespace
установлены по умолчанию.HISTFILE
Таким образом предотвращает хранение любой истории, и не мешает команду от добавления к истории в памяти.Или
unset HISTFILE
(аналогично предыдущему ответу, только короче: export HISTFILE = / dev / null)
источник
При запуске оболочки я явно очищаю историю от записей, которые мне не нужны. Например, я не хочу ничего
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
источник