Wyjaśnij, dlaczego .bash_logout nie uruchamia poleceń?

11

Zastanawiałem się więc, jak uruchomić te dwa wiersze kodu za każdym razem, gdy zamykam otwartą instancję Terminala:

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

Jestem export HISTFILE=5przy starcie, ale nadal chcę to wypłukać, kiedy skończę.

Próbowałem rozejrzeć się trochę w kilku miejscach i nie miałem szczęścia .

Korzystam z Linux Mint i tutaj też zauważam, że napotkałem podobny problem z .bash_profile; w końcu odkryłem, że muszę umieścić cały kod startowy .bashrc, więc może to ma coś z tym wspólnego. Oto mój .bash_logoutplik:

#!/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

Próbowałem zmienić aranżację tego skryptu na wiele sposobów, nie jestem pewien, czy nie rozumiem, jak działa bash i czy którykolwiek z nich działa w pierwszej kolejności. Czy fakt, że uruchamiam Xservermake bash, uważa Terminal za coś, co nie jest wylogowaniem przy wyjściu?

To nie znaczy, że jestem nie zalogowany, który ma sensu:

$> shopt login_shell
login_shell     off
Droogany
źródło
Jako ogólny komentarz, jeśli testujesz, czy uruchamiany jest skrypt konfiguracji powłoki, zalecamy umieszczenie echopolecenia na początku, zanim zrobi cokolwiek innego, co mogłoby zakłócić echouruchamianie. Błąd może spowodować, że skrypt zakończy działanie, zanim dotrze do końca.
Chris Page
Z tego, jak to sformułowałeś, oraz z faktu, że sprawdzasz SHLVL = 1, zakładałem, że już sprawdziłeś, czy jest to powłoka logowania. Czy to jest Co shopt login_shellmówi
Chris Page

Odpowiedzi:

25

Zakładając, że zweryfikowałeś, że jest to powłoka logowania ( shopt login_shell):

~ / .bash_logout jest uruchamiany tylko wtedy, gdy jawnie zamkniesz powłokę za pomocą exitlub logout, lub wpisując Control-D, aby wprowadzić koniec pliku w wierszu polecenia. Jeśli zamkniesz emulator terminala, procesy są wysyłane SIGHUP, a bash nie uruchamia się ~ / .bash_logout w tym przypadku.

Jeśli chcesz wykonywać pracę za każdym razem, gdy kończysz bash (i czy jest to powłoka logowania, czy nie), użyj trap foo EXIT. Najwygodniejszym sposobem na to jest umieszczenie kodu w funkcji powłoki, np .:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT
Chris Page
źródło
1
Czuję się jak zmarnowany idealnie dobry problem na moje złe pytanie. Zapytam jeszcze raz, czy zdołam ominąć twoje pierwsze zdanie i nadal mam problemy. Do licha.
Droogany,
6

~/.bash_logoutjest uruchamiany tylko przez powłokę logowania (taką jak ta, którą dostajesz na sesjach tty lub z bash -l). Jest ignorowany przez powłoki niezalogowane, które działają na większości terminali.

Więcej informacji znajduje się na stronie podręcznika bash (1), w części „ZAPROSZENIE”.


Jeśli nie chcesz zachować trwałej historii, po prostu ją rozbrój HISTFILElub ustaw HISTFILE=/dev/null. Spowoduje to automatyczne odrzucenie historii przy wyjściu, jednocześnie umożliwiając zachowanie jej dla bieżącej powłoki ( HISTSIZE=100).

użytkownik1686
źródło