9

Поэтому мне было интересно, как запускать эти две строки кода каждый раз, когда я закрываю открытый экземпляр Terminal:

history -c
cat /dev/null > ~/.bash_history

Я export HISTFILE=5 при запуске, но все же хочу избавиться от этого, когда я закончу .

Я попытался немного осмотреться в нескольких местах, и мне не повезло.

Я запускаю Linux Mint, и здесь также отмечу, что у меня возникла похожая проблема с .bash_profile ; в конце концов я обнаружил, что мне нужно поместить весь стартовый код в .bashrc , так что, возможно, это как-то связано с этим. Вот мой файл .bash_logout :

#!/bin/bash
# ~/.bash_logout: executed by bash(1) when login shell exits.

#this does nothing on exit...
echo 'logout'; sleep 2s

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    history -c
    cat /dev/null > ~/.bash_history
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

Я пытался перестроить этот сценарий многими способами, я не уверен, что я не понимаю, как работает bash, и работает ли вообще что-то из этого. Тот факт, что я запускаю Xserver заставляет bash рассматривать Terminal как выход из системы при выходе?

Это говорит о том, что я не вошел в систему, что имело бы смысл:

$> shopt login_shell
login_shell     off

2 ответа2

23

Предполагая, что вы убедились, что это оболочка для входа (shopt login_shell):

~/.bash_logout запускается только в том случае, если вы явно выходите из оболочки с помощью exit или logout , или вводите Control-D для ввода конца файла в командной строке. Если вы закрываете эмулятор терминала, процессы отправляются SIGHUP, и bash в этом случае не запускает ~/.bash_logout.

Если вы хотите выполнять работу в любое время при выходе из bash (и независимо от того, является ли это оболочкой входа в систему или нет), используйте trap foo EXIT . Самый удобный способ сделать это - поместить ваш код в функцию оболочки, например:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT
6

~/.bash_logout запускается только оболочкой входа в систему (например, той, что вы получаете в сеансах tty или с помощью bash -l). Он игнорируется не входящими в систему оболочками, которые используются большинством терминалов.

См. Страницу руководства bash(1) в разделе "ПРИЗНАНИЕ" для получения дополнительной информации.


Если вы не хотите сохранять постоянную историю, просто HISTFILE или установите HISTFILE=/dev/null . Это автоматически удалит историю при выходе, но при этом сохранит ее для текущей оболочки (HISTSIZE=100).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .