Объясните, почему.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 или любой другой файл на диске.
После того, как я закрыл приложение терминала с активным сеансом и снова вошёл в систему, история исчезла из вывода файлов и команд истории.