Если я случайно ввожу свой пароль или что-нибудь еще, что чувствительно в bash, я могу легко удалить эту строку с помощью history -d ROW#
, но я всегда остаюсь с командой history -d ROW#
в истории, показывающей всем, что кто-то исправил ошибку.
Могу ли я добавить что-либо в команду, чтобы она не появлялась в истории bash?
Чтобы не сохранять ни одной команды в вашей истории, просто поставьте перед ней пробел (здесь отмечены ␣
):
$ echo test
test
$ history | tail -n2
3431 echo test
3432 history | tail -n2
$ ␣echo test2
test2
$ history | tail -n2
3431 echo test
3432 history | tail -n2
Это поведение установлено в вашем ~/.bashrc
, а именно в этой строке:
HISTCONTROL=ignoreboth
man bash
говорит:
HISTCONTROL
Список разделенных двоеточиями значения, управляющие тем, как команды сохраняются в списке истории. Если список значений включает ignorespace , строки , начинающиеся с пробела, не сохраняются в списке истории . Значение ignoredups приводит к тому, что строки, соответствующие предыдущей записи истории, не будут сохранены. Значение ignoreboth является сокращением для ignorespace и ignoredups .
ignoredups
, кстати, является причиной, почему history | tail -n2
появляется только один раз в истории в вышеупомянутом тесте.
История терминала сохраняется в оперативной памяти и сбрасывается на ваш ~/.bash_history
, как только вы закрываете терминал. Если вы хотите удалить конкретную запись из вашего ~/.bash_history
, вы можете сделать это с помощью sed
:
# print every line…
sed '/^exit$/!d' .bash_history # … which is just “exit”
sed '/^history/!d' .bash_history # … beginning with “history”
sed '/>>log$/!d' .bash_history # … ending with “>>log”
sed '\_/path/_!d' .bash_history # … containing “/path/” anywhere
В последнем я изменил разделитель по умолчанию /
на _
, поскольку он используется внутри поискового термина это фактически равно sed -i '/\/path\//d' .bash_history
. Если команда выводит только те строки, которые вы хотите удалить, добавьте опцию -i
и измените !d
на d
, чтобы выполнить удаление:
# delete every line…
sed -i '/^exit$/d' .bash_history # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history # … ending with “>>log”
sed -i '\_/path/_d' .bash_history # … containing “/path/” anywhere
Один из способов - установить переменную окружения HISTIGNORE
. Из man bash
HISTIGNORE
A colon-separated list of patterns used to decide which command
lines should be saved on the history list. Each pattern is
anchored at the beginning of the line and must match the com‐
plete line (no implicit `*' is appended). Each pattern is
tested against the line after the checks specified by HISTCON‐
TROL are applied.
[FWIW, по умолчанию HISTCONTROL
предоставляется обходное решение типа a-space-in-front].
Так, например,
HISTIGNORE='history -d*'
Если вы хотите, чтобы он был постоянным, экспортируйте его из вашего ~/.bashrc
export HISTIGNORE='history -d*'
Вы можете
Закрыть окно (я) терминала . Это будет сбрасывать самую последнюю историю в окне терминала, которое вы закрываете последним (после закрытия других окон) в файл /home/$USER/.bash_history
Редактировать файл /home/$USER/.bash_history
без участия bash
, например, запустив ваш любимый редактор с помощью Alt kbd> + F2 kbd>
Таким образом, вы можете просмотреть всю историю и удалить что бы там ни было, что ты больше не хочешь быть там.
Я обычно использую:
history -w; history -c; $EDITOR $HISTFILE; history -r
Файл истории записывается на диск, очищается в памяти, вы редактируете его так, как хотите, а затем отредактированный файл истории читается обратно.
Обратите внимание, что если ваш редактор сохраняет файлы резервных копий, непослушное слово все равно может появиться на диске.
Другой вариант, использующий -d
, заключается в использовании предиктивных номеров истории:
startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239 # bad thing
17240 history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239 # good thing
17240 # other thing
17241 history | tail -n 3
В этом примере я удаляю плохую вещь, удаляю команду для получения номера истории, а затем удаляю Команда, которую я использовал для удаления истории. Все тогда продезинфицировано.
Если вы хотите запустить команду, не сохраняя ее в истории, добавьте к ней дополнительный пробел
prompt$ echo saved
prompt$ echo not saved \
> # ^ extra space
Чтобы это работало, вам нужно либо ignorespace, либо ignoreboth в HISTCONTROL. Например, запустите
HISTCONTROL = ignorespace Чтобы сделать этот параметр постоянным, поместите его в свой .bashrc.