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


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

2
+1 за метод 'kill -9 $$'. Это, безусловно, один из способов обхода ситуаций, когда HISTIGNORE и т. Д. Устанавливаются только для чтения.
Кори Хендерсон

7
Я не думаю, что это хорошая идея продвигать использование kill -9для чего-либо, кроме тяжелых ситуаций, когда все остальное потерпело неудачу.
Кристофер Хаммарстрем

1
Отправка SIGKILL никогда не будет хорошей идеей в качестве стандартной операционной процедуры. Используйте правильные процедуры, такие как сброс HISTFILE.
Arcege

@ Arcege TMTOWTDI.
амфетамина

Я хотел знать обратное - увы, как убить Баша, убедившись, что он спасет его историю - и это ответило на мой вопрос, спасибо.
mveroone

3

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


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сброс буфера прокрутки назад.


Когда ОП сказали, что они использовали 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.