Explique por que o .bash_logout não executa comandos?

11

Então, eu tenho me perguntado como executar essas duas linhas de código toda vez que fecho uma instância aberta do Terminal:

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

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

Tentei procurar um pouco em alguns lugares e não tive muita sorte .

Eu executo o Linux Mint e também observaria aqui que tive um problema semelhante com .bash_profile; finalmente, descobri que precisava inserir todo o código de inicialização .bashrc, então talvez isso tenha algo a ver com isso. Aqui está o meu .bash_logoutarquivo:

#!/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 algo está sendo executado em primeiro lugar. O fato de eu executar o Xservermake bash considera o Terminal algo que não é um logout na saída?

Não é dizer que estou não logado, o que faria sentido:

$> shopt login_shell
login_shell     off
Droogans
fonte
Como comentário geral, se você estiver testando se um script de configuração de shell está sendo executado, recomendo que você coloque o echocomando no início, antes de fazer qualquer outra coisa que possa interferir na echoexecução. Um erro pode causar a saída do script antes de chegar ao fim.
Chris Página
Eu estava assumindo, pela maneira como você formulou isso, e pelo fato de você estar procurando por SHLVL = 1, que você já verificou que é um shell de logon. É isso? O que shopt login_shelldiz?
Chris Page

Respostas:

25

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

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

Se você deseja executar o trabalho a qualquer momento, o bash termina (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
Chris Page
fonte
11
Sinto-me como um desperdiçado um problema perfeitamente bom na minha má pergunta. Vou perguntar novamente se eu passar da sua primeira frase e ainda tiver problemas. Sheesh.
Droogans
6

~/.bash_logouté executado apenas por um shell de login (como o que você recebe em tty sessões ou com bash -l). É ignorado por shells sem 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, desative HISTFILEou defina HISTFILE=/dev/null. Isso descartará automaticamente o histórico na saída, enquanto ainda permite que ele seja mantido para o shell atual ( HISTSIZE=100).

user1686
fonte