Expliquez pourquoi .bash_logout n'exécutera pas de commandes?

11

Je me suis donc demandé comment exécuter ces deux lignes de code chaque fois que je ferme une instance ouverte de Terminal:

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

Je suis export HISTFILE=5au démarrage, mais je veux toujours éliminer cela lorsque j'aurai terminé.

J'ai essayé de regarder un peu dans quelques endroits et je n'ai pas eu beaucoup de chance .

Je lance Linux Mint, et je voudrais également noter ici que j'ai rencontré un problème similaire avec .bash_profile; finalement, j'ai découvert que je devais placer tout le code de démarrage .bashrc, alors peut-être que cela a quelque chose à voir avec cela. Voici mon .bash_logoutdossier:

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

J'ai essayé de réorganiser ce script de nombreuses façons, je ne sais pas si je ne comprends pas comment fonctionne bash, et si tout cela fonctionne en premier lieu. Le fait que Xserverj'exécute fasse bash considérer Terminal comme quelque chose qui n'est pas une déconnexion à la sortie?

Cela dit que je ne suis pas connecté, ce qui aurait du sens:

$> shopt login_shell
login_shell     off
Droogans
la source
En général, si vous testez si un script de configuration shell est en cours d'exécution, je vous recommande de mettre la echocommande au début, avant qu'elle ne fasse quoi que ce soit qui pourrait interférer avec l' echoexécution en cours d'exécution. Une erreur pourrait entraîner la fermeture du script avant la fin.
Chris Page
Je supposais, d'après la façon dont vous avez formulé cela et le fait que vous vérifiez SHLVL = 1, que vous avez déjà vérifié qu'il s'agit d'un shell de connexion. C'est ça? Que shopt login_shelldit-on?
Chris Page

Réponses:

25

En supposant que vous avez vérifié qu'il s'agit d'un shell de connexion ( shopt login_shell):

~ / .bash_logout n'est exécuté que si vous quittez explicitement le shell avec exitou logout, ou en tapant Control-D pour entrer une fin de fichier à l'invite de commande. Si vous fermez l'émulateur de terminal, les processus sont envoyés SIGHUP et bash n'exécute pas ~ / .bash_logout dans ce cas.

Si vous souhaitez effectuer un travail à chaque sortie de bash (et qu'il s'agisse d'un shell de connexion ou non), utilisez trap foo EXIT. La façon la plus pratique de le faire est de mettre votre code dans une fonction shell, par exemple:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT
Chris Page
la source
1
Je me sens comme un problème parfaitement bon perdu sur ma mauvaise question. Je vais demander à nouveau si j'ai dépassé votre première phrase et que j'ai toujours des problèmes. Sheesh.
Droogans
6

~/.bash_logoutest uniquement géré par un shell de connexion (comme celui que vous obtenez sur les sessions tty ou avec bash -l). Il est ignoré par les shells sans connexion, que la plupart des terminaux exécutent.

Voir la page de manuel de bash (1), sous "INVOCATION", pour plus de détails.


Si vous ne souhaitez pas conserver l'historique persistant, désactivez HISTFILE-le ou définissez-le HISTFILE=/dev/null. Cela supprimera automatiquement l'historique à la sortie, tout en permettant de le conserver pour le shell actuel ( HISTSIZE=100).

user1686
la source