Как закрыть терминал без сохранения истории?

33

Не раз я случайно запускал несколько команд и загрязнял мою историю bash. Как мне закрыть свой терминал, не сохраняя мою историю Bash? Я использую Fedora.

Михаил Мрозек
источник

Ответы:

25

История вашей оболочки сохраняется в файле, указанном HISTFILEпеременной. Так:

unset HISTFILE

Это также относится к zsh, но не к ksh, который сохраняет данные в файл, указанный $HISTFILEпри запуске оболочки (и наоборот, вы решаете сохранить свою историю в ksh после запуска оболочки).

Жиль "ТАК - перестань быть злым"
источник
Я могу использовать это, прежде чем выйти из системы после того, как я осквернил историю? и его стремление к этой сессии? мне не нужно в set HISTFILEследующий раз войти в систему? (просто скажите, если это правильно или неправильно)
@ acidzombie24 Это правильно, изменения переменных среды не сохраняются между сеансами, если вы не сохраните изменения явно, например, в файлах rc.
jw013
31

Краткий ответ:

Введите это в командной строке:

$ kill -9 $$

Это сразу же убьет вашу оболочку, и оболочка не сможет ничего сделать, например перехватить сигнал, сохранить историю, выполнить ~/.bash_logout, предупредить о остановленных заданиях или что-то в этом роде.

Длинный ответ:

Примечание. Эти параметры не являются взаимоисключающими; все они могут быть использованы одновременно.

Опция 1:

Если вы перфекционист, когда дело доходит до загромождения файла истории, то вы можете изменить HISTIGNOREпеременную, включив в нее глобусы команд, которые вы не хотите записывать. Например, если вы добавляете HISTIGNORE='ls*:cd*'в свой, ~/.bashrcто любой экземпляр lsи cdне вставляете в свой файл истории.

Вариант 2:

Если вы хотите поочередно контролировать, какие команды будут исключены из вашей истории, вы можете указать, HISTCONTROL='ignorespace'какие команды будут пропущены, начиная с пробела. Использование ignorebothтакже пропускает повторяющиеся строки. Затем, нажав пробел перед вводом команды, вы не увидите ее в файле истории.

Вариант 3:

Если вы просто хотите сделать так, чтобы при закрытии терминала оболочка немедленно выходила, вы можете trapподать сигнал, который терминальная программа отправляет оболочку ( xtermнапример, отправляет, SIGHUPзатем ждет, когда оболочка завершит работу) и выполнить выход без сохранения истории, когда она получает этот сигнал. Добавьте это к вашему ~/.bashrc:

# don't record history when the window is closed
trap 'unset HISTFILE; exit' SIGHUP
amphetamachine
источник
2
+1 за метод 'kill -9 $$'. Это, безусловно, один из способов обхода ситуаций, когда HISTIGNORE и т. Д. Устанавливаются только для чтения.
Кори Хендерсон
7
Я не думаю, что это хорошая идея продвигать использование kill -9для чего-либо, кроме тяжелых ситуаций, когда все остальное потерпело неудачу.
Кристофер Хаммарстрем
1
Отправка SIGKILL никогда не будет хорошей идеей в качестве стандартной операционной процедуры. Используйте правильные процедуры, такие как сброс HISTFILE.
Arcege
@ Arcege TMTOWTDI.
амфетамина
Я хотел знать обратное - увы, как убить Баша, убедившись, что он спасет его историю - и это ответило на мой вопрос, спасибо.
mveroone
3

Я удивлен, увидев, что никто не предложил history -cсразу до exit. IINM (я не эксперт), это будет хорошо.

msh210
источник
2
Вы на правильном пути: history -rперечитаете файл истории, поэтому сохранение станет невозможным.
Саймон Рихтер
Сбрасывать историю - это плохая привычка ... история оболочки содержит много полезной информации о том, кто что сделал. это очень полезно для людей, которые являются новичками на ваших платформах (если вы не уверены на 100% в своей документации, управлении изменениями)
Франклин Пит
2

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

Вы можете удалить историю вашего сеанса с помощью любого из них (установите во время сеанса, который вы хотите опустить в файле истории):

HISTFILE=/dev/null

или

HISTSIZE=0

Любой из этих вариантов отлично работает в Bash на Fedora

Эли Хедри
источник
1

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

Саймон Рихтер
источник
0
  1. Эли уже дал вам правильный ответ для Bash, который нужно установить HISTSIZE=0.

  2. Я бы просто добавил метод, чтобы сделать это для экрана GNU . Нажмите Ctrl+A(последовательность выхода из экрана) и затем :scrollback 0. Это удалит историю прокрутки. Теперь вы можете сразу же сделать :scrollback 15000сброс буфера прокрутки назад.

gsbabil
источник
Когда ОП сказали, что они использовали screen(1)?
амфетамина
Он не Но вы можете запускать Bash в сеансе экрана, и HISTSIZE = 0 все равно оставит детали вашей активности в буфере обратной прокрутки экрана. Так что, если вы действительно хотите, чтобы это было чисто, вы должны сделать то scrollback=0же самое
gsbabil
Буфер прокрутки очищается при закрытии окна (т.е. при выходе из оболочки). А что если вы набрали Ctrl-a H? Это убьет файл журнала?
амфетамина
@amphetamachine: нет, он только начнет / завершит запись текущего окна. Ни то, Ctrl+a Hни другое не Ctrl+a :clearудалит историю. Вам нужно Ctrl+a :scrollback 0. Вы можете проверить это сами. Начните новый сеанс экрана. Теперь сделай cat /etc/passwd. Теперь сделайте любое из вышеперечисленного - Ctrl+a Hили Ctrl+a :clear. Теперь попробуйте выполнить копирование из экранного буфера, нажав на значок, а Ctrl+a [затем на стрелку вверх, чтобы увидеть, как далеко вы можете копировать. Если вы сделали a, Ctrl+a :scrollbackа затем a clear, вы бы пошли так далеко, как видите в текущем окне, поскольку не будет никакого буфера прокрутки.
gsbabil