Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Если вы установили переменную среды 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.

См. также:

Ответ 2

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

$ ls  # goes in history
$  ls # does not

Ответ 3

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

Ответ 4

Вы можете сделать одну из двух вещей:

export HISTFILE=/dev/null

Или, начните команду с пробела.

Ответ 5

kill -9 $$

Я знаю, что это не так хорошо, как выше, но это убьет текущую оболочку bash без сохранения чего-либо, полезно, когда HISTCONTROL не установлен по умолчанию, вы забыли установить его или просто, вы забыли поставить начальный пробел и просто введите некоторые пароли и не хотите, чтобы они оставались в истории навсегда, это быстрый способ, что-то вроде удаления файла истории не так хорошо, потому что вам нужно сделать это вне оболочки сохранения истории (войдите под другим пользователем и использовать su/sudo, создание фоновой работы и т.д.)

Ответ 6

или

unset HISTFILE

(аналогично предыдущему ответу только короче: export HISTFILE =/dev/null)

Ответ 7

При запуске оболочки я явно очищаю историю от записей, которые я не хочу быть там. Например, мне не нужна никакая 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