Come posso impedire a tmux di uscire con Ctrl-d?


30

Uso tmux sul mio server e recentemente ho scoperto che ctrl-d uscirà da tmux e perderà tutte le informazioni sulla sessione, la mia intenzione era semplicemente quella di terminare la sessione ssh ma non ho notato che ero ancora in tmux fino a tardi.

Sono consapevole che dovrei stare attento in futuro quando uso ctrl-d ma mi chiedevo se esiste un modo per impedire a tmux di uscire quando si colpisce ctrl-d per caso? Una soluzione come una richiesta, una conferma o un distacco andrebbe bene.

Risposte:


36

Per essere precisi, Ctrldnon esce tmux, ma piuttosto una shell. Se quella shell è in esecuzione nell'unico riquadro dell'ultima finestra della tmuxsessione, la sessione termina e il tmuxclient esce.

Per impedire l' Ctrlduscita dalla shell, è possibile impostare la IGNOREEOFvariabile shell o impostare l' ignoreeofopzione shell. Inserisci una delle seguenti opzioni nel tuo .bashrcfile:

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

set -o ignoreeof  # Same as setting IGNOREEOF=10

6
Questo è eccellente, grazie. Ho solo bisogno per tmux quindi ho usato set-environment -g 'IGNOREEOF' 2in .tmux.confe ora ho bisogno di premere Ctrl-D 3 volte per uscire e sto anche avvertito di volta in volta con il messaggio: Use "logout" to leave the shell.
Cas

7
L'impostazione della variabile d'ambiente IGNOREEOF non ha alcun effetto in zsh, ma "set -o ignoreeof" o "setopt ignoreeof" lo fanno.
sgtpep,

12

IGNOREEOFnon ha funzionato per me, quindi ho semplicemente associato Ctrl+ Da detachin .tmux.conf:

bind-key -n C-d detach

I -nmezzi senza sequenza di escape prima necessari, come il tmux prefisso.


Un anno e mezzo dopo, IGNOREOFnon ho funzionato per me da quando sto usando zsh. setopt ignoreeofnelle .zshrcopere. Ma ho dovuto uccidere tutte le sessioni di tmux per tmux alla fonte .zshrc. Forse avrei potuto .zshrcprovenire dall'interno ...
Rohmer,

1
Ho usato questo, ma ha una fastidiosa limitazione: si stacca su qualsiasi Ctrl + D, sia che venga inviato alla shell o qualcosa del genere cat > some_new_file.txt.
Mihai Danila,

Questo, tuttavia, ha un effetto collaterale in tmux con più riquadri aperti in quanto non consente di chiudere un riquadro con ^D.
Mr. Tao,

AGGIORNAMENTO Per coloro che vogliono mantenere solo l'ultima finestra / riquadro: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 mi ha insegnato a usare exec zshper riavviare zsh in tmux quando sto giocando con .zshrc
krry il

7

Oltre alla risposta di Chepner puoi impedire al terminale di inviare EOF interamente impostando eofsu undefcon stty:

stty eof undef

Ripristina con:

stty eof '^d'
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.