Jelaskan mengapa .bash_logout tidak dapat menjalankan perintah?

11

Jadi saya sudah bertanya-tanya bagaimana menjalankan dua baris kode ini setiap kali saya menutup instance terbuka Terminal:

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

Saya export HISTFILE=5memulai, tetapi masih ingin menyiramnya ketika saya selesai.

Saya sudah mencoba melihat-lihat sedikit di beberapa tempat , dan belum beruntung .

Saya menjalankan Linux Mint, dan juga mencatat di sini bahwa saya mengalami masalah yang sama dengan .bash_profile; akhirnya, saya menemukan bahwa saya harus meletakkan semua kode start up .bashrc, jadi mungkin itu ada hubungannya dengan itu. Ini .bash_logoutfile saya :

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

Saya sudah mencoba mengatur ulang skrip ini dengan banyak cara, saya tidak yakin apakah saya tidak mengerti cara kerja bash, dan apakah ada yang berjalan pada awalnya. Apakah fakta yang saya jalankan Xservermembuat bash mempertimbangkan Terminal sesuatu yang bukan merupakan log-out saat keluar?

Itu mengatakan bahwa saya tidak masuk, yang masuk akal:

$> shopt login_shell
login_shell     off
Droogan
sumber
Sebagai komentar umum, jika Anda menguji apakah skrip konfigurasi shell dijalankan, saya sarankan Anda meletakkan echoperintah di awal, sebelum melakukan hal lain yang dapat mengganggu echomenjalankan. Kesalahan dapat menyebabkan skrip keluar sebelum skrip berakhir.
Chris Page
Saya berasumsi dari cara Anda mengutarakan ini, dan fakta bahwa Anda memeriksa SHLVL = 1, bahwa Anda sudah memverifikasi bahwa itu adalah shell login. Apakah itu? Apa yang shopt login_shelldikatakan?
Chris Page

Jawaban:

25

Dengan asumsi Anda telah memverifikasi bahwa itu adalah shell login ( shopt login_shell):

~ / .bash_logout hanya dijalankan jika Anda secara eksplisit keluar dari shell dengan exitatau logout, atau dengan mengetik Control-D untuk memasukkan file-akhir pada prompt perintah. Jika Anda menutup emulator terminal, proses dikirim SIGHUP, dan bash tidak menjalankan ~ / .bash_logout dalam kasus itu.

Jika Anda ingin melakukan pekerjaan kapan saja bash keluar (dan apakah itu shell login atau tidak), gunakan trap foo EXIT. Cara paling mudah untuk melakukan ini adalah dengan meletakkan kode Anda di fungsi shell, misalnya ,:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT
Chris Page
sumber
1
Saya merasa seperti terbuang masalah yang sangat baik pada pertanyaan buruk saya. Saya akan bertanya lagi apakah saya bisa melewati kalimat pertama Anda dan masih mengalami kesulitan. Sheesh.
Droogans
6

~/.bash_logouthanya dijalankan oleh shell login (seperti yang Anda dapatkan di sesi tty, atau dengan bash -l). Itu diabaikan oleh shell non-login, yang sebagian besar terminal berjalan.

Lihat halaman manual bash (1), di bawah "INVOCATION", untuk detail lebih lanjut.


Jika Anda tidak ingin menyimpan riwayat persisten, cukup HISTFILEsetel, atau setel HISTFILE=/dev/null. Ini akan secara otomatis membuang riwayat saat keluar, sambil tetap membiarkannya disimpan untuk shell saat ini ( HISTSIZE=100).

pengguna1686
sumber