Explique por qué .bash_logout no ejecutará comandos.

11

Así que me he estado preguntando cómo ejecutar estas dos líneas de código cada vez que cierro una instancia abierta de Terminal:

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

Estoy export HISTFILE=5en el inicio, pero todavía quiero eliminar eso cuando haya terminado.

He intentado mirar un poco en un par de lugares , y no he tenido mucha suerte .

Ejecuto Linux Mint, y también notaría aquí que me encontré con un problema similar con .bash_profile; finalmente, descubrí que necesitaba colocar todo el código de inicio .bashrc, así que tal vez eso tenga algo que ver con eso. Aquí está mi .bash_logoutarchivo:

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

He intentado reorganizar este script de muchas maneras, no estoy seguro si no entiendo cómo funciona bash, y si algo de esto se está ejecutando en primer lugar. ¿El hecho de que ejecuto Xserverhace que bash considere Terminal algo que no es un cierre de sesión al salir?

Sí dice que estoy no inscrito, lo cual tendría sentido:

$> shopt login_shell
login_shell     off
Droogans
fuente
Como comentario general, si está probando si se está ejecutando o no un script de configuración de shell, le recomiendo que coloque el echocomando al inicio, antes de que haga cualquier otra cosa que pueda interferir con la echoejecución. Un error puede hacer que el script salga antes de que llegue al final.
Chris Page
Asumí por la forma en que redactó esto, y el hecho de que está comprobando SHLVL = 1, que ya verificó que es un shell de inicio de sesión. ¿Lo es? Que shopt login_shelldice
Chris Page

Respuestas:

25

Suponiendo que haya verificado que es un shell de inicio de sesión ( shopt login_shell):

~ / .bash_logout solo se ejecuta si sale explícitamente del shell con exito logout, o al presionar Control-D para ingresar un final de archivo en el símbolo del sistema. Si cierra el emulador de terminal, los procesos se envían SIGHUP y bash no ejecuta ~ / .bash_logout en ese caso.

Si desea realizar un trabajo en cualquier momento, bash sale (y si es un shell de inicio de sesión o no), use trap foo EXIT. La forma más conveniente de hacer esto es poner su código en una función de shell, por ejemplo:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT
Chris Page
fuente
1
Siento que desperdicié un problema perfectamente bueno en mi mala pregunta. Preguntaré nuevamente si supero su primera oración y aún tengo problemas. Sheesh
Droogans
6

~/.bash_logoutsolo se ejecuta mediante un shell de inicio de sesión (como el que tiene en las sesiones tty o con bash -l). Es ignorado por los shells sin inicio de sesión, que ejecutan la mayoría de los terminales.

Consulte la página del manual de bash (1), en "INVOCACIÓN", para obtener más detalles.


Si no desea mantener un historial persistente, simplemente desarme HISTFILEo configure HISTFILE=/dev/null. Esto descartará automáticamente el historial al salir, al tiempo que permite que se mantenga para el shell actual ( HISTSIZE=100).

usuario1686
fuente