Скрыть & ldquo; history -d & rdquo; в истории Баш

Если я случайно ввожу свой пароль или что-нибудь еще, что чувствительно в bash, я могу легко удалить эту строку с помощью history -d ROW#, но я всегда остаюсь с командой history -d ROW# в истории, показывающей всем, что кто-то исправил ошибку.

Могу ли я добавить что-либо в команду, чтобы она не появлялась в истории bash?

14
задан 7 December 2017 в 18:54

5 ответов

Чтобы не сохранять ни одной команды в вашей истории, просто поставьте перед ней пробел (здесь отмечены ):

$ 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
28
ответ дан 7 December 2017 в 18:54

Один из способов - установить переменную окружения 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*'
12
ответ дан 7 December 2017 в 18:54

Вы можете

  • Закрыть окно (я) терминала . Это будет сбрасывать самую последнюю историю в окне терминала, которое вы закрываете последним (после закрытия других окон) в файл /home/$USER/.bash_history

  • Редактировать файл /home/$USER/.bash_history без участия bash, например, запустив ваш любимый редактор с помощью Alt + F2

    Таким образом, вы можете просмотреть всю историю и удалить что бы там ни было, что ты больше не хочешь быть там.

    enter image description here

    enter image description here

6
ответ дан 7 December 2017 в 18:54

Я обычно использую:

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

В этом примере я удаляю плохую вещь, удаляю команду для получения номера истории, а затем удаляю Команда, которую я использовал для удаления истории. Все тогда продезинфицировано.

1
ответ дан 7 December 2017 в 18:54

Если вы хотите запустить команду, не сохраняя ее в истории, добавьте к ней дополнительный пробел

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Чтобы это работало, вам нужно либо ignorespace, либо ignoreboth в HISTCONTROL. Например, запустите

HISTCONTROL = ignorespace Чтобы сделать этот параметр постоянным, поместите его в свой .bashrc.

0
ответ дан 7 December 2017 в 18:54

Другие вопросы по тегам:

Похожие вопросы: