Explique por que .bash_logout não executará comandos?

8

Estou pensando em como executar essas duas linhas de código toda vez que eu fecho uma instância aberta do Terminal:

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

Eu export HISTFILE=5 na inicialização, mas ainda quero liberar isso quando terminar.

Eu tentei olhar em volta um pouco em um casal de lugares e não tive muita sorte .

Eu rodei o Linux Mint, e também notaria aqui que me deparei com um problema semelhante com .bash_profile ; Eventualmente, descobri que precisava colocar todo o código de inicialização em .bashrc , então talvez isso tenha algo a ver com isso. Aqui está o meu arquivo .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

Eu tentei reorganizar esse script de várias maneiras, não tenho certeza se não entendo como o bash funciona, e se isso está sendo executado em primeiro lugar. Será que o fato de eu executar Xserver fazer o bash considerar o Terminal algo que não é um logout ao sair?

Ele diz que não estou conectado , o que faria sentido:

$> shopt login_shell
login_shell     off
    
por Droogans 10.04.2012 / 00:06

2 respostas

22

Supondo que você tenha verificado que é um shell de login ( shopt login_shell ):

~ / .bash_logout só será executado se você sair explicitamente do shell com exit ou logout ou digitando Control-D para inserir um fim de arquivo no prompt de comando. Se você fechar o emulador de terminal, os processos serão enviados em SIGHUP, e o bash não executará ~ / .bash_logout nesse caso.

Se você quiser executar o trabalho a qualquer momento, sairá (e se é um shell de login ou não), use trap foo EXIT . A maneira mais conveniente de fazer isso é colocar seu código em uma função shell, por exemplo:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT
    
por 10.04.2012 / 00:31
6

~/.bash_logout é executado apenas por um shell login (como aquele que você obtém em sessões tty ou com bash -l ). Ele é ignorado por shells não-login, que a maioria dos terminais executa.

Veja a página de manual do bash (1), em "INVOCATION", para mais detalhes.

Se você não deseja manter o histórico persistente, basta remover a configuração HISTFILE ou definir HISTFILE=/dev/null . Isso descartará automaticamente o histórico ao sair, enquanto ainda permite que ele seja mantido para o shell atual ( HISTSIZE=100 ).

    
por 10.04.2012 / 01:51