Поясніть, чому .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

Я намагався перевпорядкувати цей сценарій багатьма способами, я не впевнений, чи не розумію, як працює баш, і якщо що-небудь із цього працює в першу чергу. Чи те, що я запускаю, Xserverзмушує башти вважати Термінал чимось, що не є виходом при виході?

Це говорить про те, що я не ввійшов у систему, що мало б сенс:

$> shopt login_shell
login_shell     off

Як загальний коментар, якщо ви перевіряєте, чи запускається сценарій конфігурації оболонки, я рекомендую вам поставити 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
Я відчуваю себе марною ідеально хорошою проблемою на своєму поганому питанні. Я ще раз запитаю, чи я пройду ваше перше речення і все ще маю проблеми. Шиш.
Droogans

6

~/.bash_logoutзапускається лише оболонкою для входу (наприклад, тією, яку ви отримуєте на tty сесіях або з ними bash -l). Вона ігнорується оболонками без входу, якими працює більшість терміналів.

Детальнішу інформацію див. На сторінці керівництва bash (1) у розділі "ІНВОКАЦІЯ".


Якщо ви не хочете зберігати постійну історію, просто скасуйте HISTFILEабо встановіть HISTFILE=/dev/null. Це автоматично відкидає історію при виході, зберігаючи її для поточної оболонки ( HISTSIZE=100).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.