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

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

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

$> shopt login_shell
login_shell     off

3 ответа

Решение

Предполагая, что вы убедились, что это оболочка входа в систему (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

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

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


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

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

      >$HISTFILE;export HISTFILE=;echo "export HISTFILE=" >> ~/.bashrc

Запустите эту команду для каждого пользователя, для которого вы хотите: очистить файл истории bash; удалить файл истории bash

Результат: очевидно, он запоминает историю только в рамках активного сеанса (в памяти, доступной конкретному пользователю), просматривает текущую историю сеанса с помощью команды «история», НЕ сохраняя ее в bash_history или любой другой файл на диске.

После того, как я закрыл приложение терминала с активным сеансом и снова вошёл в систему, история исчезла из вывода файлов и команд истории.

Другие вопросы по тегам