Объясните, почему .bash_logout не запускает команды?

11

Поэтому мне было интересно, как запускать эти две строки кода каждый раз, когда я закрываю открытый экземпляр 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, и работает ли вообще что-то из этого. Тот факт, что я запускаю Xservermake bash, рассматривает Terminal как выход из системы при выходе?

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

$> shopt login_shell
login_shell     off
Droogans
источник
В качестве общего комментария, если вы проверяете, запускается ли скрипт конфигурации оболочки, я рекомендую поместить echoкоманду в начале, прежде чем она сделает что-либо еще, что может помешать echoзапуску. Ошибка может привести к завершению работы сценария до его завершения.
Крис Пейдж
Исходя из того, как вы это сформулировали, и того факта, что вы проверяете SHLVL = 1, я предполагал, что вы уже убедились, что это оболочка для входа. Это? Что shopt login_shellговорит?
Крис Пейдж

Ответы:

25

Предполагая, что вы убедились, что это оболочка входа в систему ( 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
Крис Пейдж
источник
1
По моему плохому вопросу я чувствую себя совершенно напрасной проблемой. Я спрошу еще раз, если я закончу ваше первое предложение и все еще буду иметь проблемы. Sheesh.
Дрооганс
6

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

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


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

user1686
источник