Spiega perché .bash_logout non eseguirà i comandi?


11

Quindi mi chiedevo come eseguire queste due righe di codice ogni volta che chiudo un'istanza aperta di Terminal:

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

Io export HISTFILE=5all'avvio, ma voglio ancora scaricarlo quando ho finito.

Ho provato a guardarmi un po ' in giro in un paio di posti e non ho avuto molta fortuna .

Corro Linux Mint, e qui noterei anche che ho riscontrato un problema simile con .bash_profile; alla fine, ho scoperto che dovevo inserire tutto il codice di avvio .bashrc, quindi forse ha qualcosa a che fare con esso. Ecco il mio .bash_logoutfile:

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

Ho provato a riorganizzare questo script in molti modi, non sono sicuro se non capisco come funziona bash e se tutto ciò è in esecuzione in primo luogo. Il fatto che io esegua Xserverbash considera Terminal qualcosa che non è una disconnessione all'uscita?

Non dire che io sono , non collegato, che avrebbe senso:

$> shopt login_shell
login_shell     off

Come commento generale, se si sta verificando se viene eseguito o meno uno script di configurazione della shell, si consiglia di inserire il echocomando all'inizio, prima di fare qualsiasi altra cosa che possa interferire con l' echoesecuzione. Un errore potrebbe causare la chiusura dello script prima che giunga alla fine.
Chris Pagina

Stavo supponendo dal modo in cui lo hai definito, e dal fatto che stai controllando SHLVL = 1, che hai già verificato che si tratta di una shell di accesso. È? Cosa shopt login_shelldice?
Chris Page

Risposte:


25

Supponendo che tu abbia verificato che si tratta di una shell di login ( shopt login_shell):

~ / .bash_logout viene eseguito solo se si esce esplicitamente dalla shell con exito logout, o digitando Control-D per immettere un end-of-file al prompt dei comandi. Se si chiude l'emulatore di terminale, i processi vengono inviati SIGHUP e in tal caso bash non esegue ~ / .bash_logout.

Se vuoi eseguire lavori ogni volta che bash esce (e che si tratti di una shell di login o meno), usa trap foo EXIT. Il modo più conveniente per farlo è mettere il codice in una funzione di shell, ad esempio:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT

1
Mi sento come uno spreco di un problema perfettamente buono sulla mia cattiva domanda. Ti chiederò di nuovo se supererò la tua prima frase e avrò ancora problemi. Sheesh.
Droogans,

6

~/.bash_logoutè gestito solo da una shell di login (come quella che si ottiene su sessioni tty o con bash -l). Viene ignorato da shell non di accesso, che la maggior parte dei terminali esegue.

Vedere la pagina di manuale di bash (1), sotto "INVOCATION", per ulteriori dettagli.


Se non si desidera mantenere la cronologia persistente, è sufficiente disinserirla HISTFILEo impostarla HISTFILE=/dev/null. Questo eliminerà automaticamente la cronologia all'uscita, pur consentendo di conservarla per la shell corrente ( HISTSIZE=100).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.