Erklären Sie, warum .bash_logout keine Befehle ausführt.

11

Daher habe ich mich gefragt, wie diese beiden Codezeilen jedes Mal ausgeführt werden sollen, wenn ich eine offene Instanz von Terminal schließe:

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

Ich bin export HISTFILE=5beim Start, möchte das aber trotzdem ausspülen, wenn ich fertig bin.

Ich habe versucht , mich an einigen Stellen ein bisschen umzusehen , und hatte nicht viel Glück .

Ich verwende Linux Mint und möchte hier auch darauf hinweisen, dass ich auf ein ähnliches Problem mit gestoßen bin .bash_profile. Schließlich stellte ich fest, dass ich den gesamten Startcode einfügen .bashrcmusste. Vielleicht hat das etwas damit zu tun. Hier ist meine .bash_logoutDatei:

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

Ich habe versucht, dieses Skript auf viele Arten neu anzuordnen. Ich bin mir nicht sicher, ob ich nicht verstehe, wie Bash funktioniert, und ob irgendetwas davon überhaupt ausgeführt wird. XserverBetrachtet die Tatsache, dass ich Bash ausführe , Terminal als etwas, das sich beim Beenden nicht abmeldet?

Es heißt, dass ich nicht eingeloggt bin , was Sinn machen würde:

$> shopt login_shell
login_shell     off
Droogans
quelle
Wenn Sie testen, ob ein Shell-Konfigurationsskript ausgeführt wird oder nicht, empfehlen wir Ihnen, den echoBefehl am Anfang zu setzen, bevor er etwas anderes ausführt, das echodie Ausführung beeinträchtigen könnte . Ein Fehler kann dazu führen, dass das Skript beendet wird, bevor es das Ende erreicht.
Chris Seite
Ich habe aufgrund der Art und Weise, wie Sie dies formuliert haben, und der Tatsache, dass Sie nach SHLVL = 1 suchen, angenommen, dass Sie bereits überprüft haben, dass es sich um eine Login-Shell handelt. Ist es? Was shopt login_shellsagt das aus?
Chris Seite

Antworten:

25

Angenommen, Sie haben überprüft, dass es sich um eine Anmeldeshell handelt ( shopt login_shell):

~ / .bash_logout wird nur ausgeführt, wenn Sie die Shell explizit mit exitoder logoutoder durch Eingabe von Control-D beenden, um an der Eingabeaufforderung ein Dateiende einzugeben. Wenn Sie den Terminalemulator schließen, werden Prozesse SIGHUP gesendet, und bash führt in diesem Fall ~ / .bash_logout nicht aus.

Wenn Sie bei jedem Beenden von Bash Arbeiten ausführen möchten (und ob es sich um eine Anmeldeshell handelt oder nicht), verwenden Sie trap foo EXIT. Der bequemste Weg, dies zu tun, besteht darin, Ihren Code in eine Shell-Funktion einzufügen, z.

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT
Chris Page
quelle
1
Ich fühle mich wie ein verschwendetes, vollkommen gutes Problem mit meiner schlechten Frage. Ich werde noch einmal fragen, ob ich Ihren ersten Satz hinter mir habe und immer noch Probleme habe. Meine Güte.
Droogans
6

~/.bash_logoutwird nur von einer Login- Shell ausgeführt (z. B. der, die Sie in tty-Sitzungen oder mit tty erhalten bash -l). Es wird von Nicht-Login-Shells ignoriert, die von den meisten Terminals ausgeführt werden.

Weitere Informationen finden Sie auf der Handbuchseite von bash (1) unter "INVOCATION".


Wenn Sie den persistenten Verlauf nicht beibehalten möchten, deaktivieren HISTFILEoder setzen Sie ihn einfach HISTFILE=/dev/null. Dadurch wird der Verlauf beim Beenden automatisch verworfen, während er weiterhin für die aktuelle Shell ( HISTSIZE=100) beibehalten werden kann .

user1686
quelle