Bagaimana saya bisa mencegah tmux keluar dengan Ctrl-d?

30

Saya menggunakan tmux di server saya dan baru-baru ini saya menemukan bahwa ctrl-d akan keluar dari tmux dan kehilangan semua informasi sesi, maksud saya adalah untuk hanya mengakhiri sesi ssh tetapi gagal untuk menyadari bahwa saya masih di tmux sampai terlambat.

Saya sadar bahwa saya harus berhati-hati di masa depan ketika menggunakan ctrl-d tapi saya bertanya-tanya apakah ada cara untuk mencegah tmux untuk keluar ketika memukul ctrl-d secara tidak sengaja? Solusi seperti prompt, konfirmasi atau pelepasan akan baik-baik saja.

Cas
sumber

Jawaban:

36

Tepatnya, Ctrldtidak keluar tmux, melainkan sebuah shell. Jika shell itu berjalan di panel hanya dari jendela terakhir dalam tmuxsesi, sesi berakhir dan tmuxklien keluar.

Untuk mencegah Ctrldkeluar dari shell, Anda dapat mengatur IGNOREEOFvariabel shell, atau mengatur ignoreeofopsi shell. Masukkan salah satu dari berikut ini di .bashrcfile Anda :

IGNOREEOF=10   # Shell only exists after the 10th consecutive Ctrl-d

set -o ignoreeof  # Same as setting IGNOREEOF=10
chepner
sumber
6
Itu luar biasa, terima kasih. Aku hanya membutuhkannya untuk tmux jadi saya menggunakan set-environment -g 'IGNOREEOF' 2di .tmux.confdan sekarang saya perlu untuk memukul Ctrl-d 3 kali untuk keluar dan saya juga memperingatkan setiap kali dengan pesan: Use "logout" to leave the shell.
Cas
7
Pengaturan variabel lingkungan IGNOREEOF tidak berpengaruh pada zsh, tetapi "set -o igneof" atau "setopt igneof" tidak.
sgtpep
12

IGNOREEOFtidak bekerja untuk saya jadi saya hanya terikat Ctrl+ Dke detachdalam .tmux.conf:

bind-key -n C-d detach

The -nberarti tidak ada urutan escape sebelum dibutuhkan, seperti tmux awalan.

Rohmer
sumber
Setahun setengah kemudian, IGNOREOFtidak bekerja untuk saya sebelumnya karena saya menggunakan zsh. setopt ignoreeofdalam .zshrckarya. Tapi saya harus membunuh semua sesi tmux untuk sumber tmux .zshrc. Mungkin saya bisa bersumber .zshrcdari dalam tmux ...
Rohmer
1
Saya telah menggunakan ini, tetapi memiliki batasan yang menjengkelkan: itu terlepas pada Ctrl + D, apakah itu dikirim ke shell atau ke sesuatu seperti cat > some_new_file.txt.
Mihai Danila
Ini, bagaimanapun, memiliki efek samping dalam tmux dengan lebih banyak panel terbuka karena tidak membiarkan Anda menutup panel ^D.
Tn. Tao
PEMBARUAN Bagi mereka yang hanya ingin menjaga jendela / panel terakhir:bind -n C-d if-shell -b 'USHELL="$(basename "$(getent passwd $USER | cut -d: -f7)")"; [ $(tmux list-windows | wc -l) -eq 1 -a $(tmux list-panes | wc -l) -eq 1 -a $(pstree $PPID | egrep "\\b$USHELL\$" | grep -o $USHELL | wc -l) -eq 1 ]' detach 'send C-d'
Frederick Zhang
1
@Rohmer, prezto mengajari saya menggunakan exec zshuntuk me-restart zsh dalam tmux ketika saya bermain dengan .zshrc
krry
7

Selain chepner ini jawaban Anda dapat menghentikan terminal mengirim EOF seluruhnya oleh pengaturan eofuntuk undefdengan stty:

stty eof undef

Setel ulang dengan:

stty eof '^d'
Thor
sumber