Comment empêcher la fermeture de tmux avec Ctrl-d?

30

J'utilise tmux sur mon serveur et récemment, j'ai découvert à mes dépens que ctrl-d quitterait tmux et perdrait toutes les informations de session, mon intention était simplement de mettre fin à la session ssh mais je n'ai pas remarqué que j'étais encore dans tmux jusqu'à trop tard.

Je suis conscient que je devrais être prudent à l'avenir lors de l'utilisation de ctrl-d, mais je me demandais s'il y avait un moyen d'empêcher tmux de quitter lorsque vous appuyez sur ctrl-d par accident? Une solution telle qu'une invite, une confirmation ou un détachement serait bien.

Cas
la source

Réponses:

36

Pour être précis, Ctrldne sort pas tmux, mais plutôt un shell. Si ce shell s'exécute dans le seul volet de la dernière fenêtre de la tmuxsession, la session se termine et le tmuxclient se ferme.

Pour éviter Ctrldde quitter le shell, vous pouvez définir la IGNOREEOFvariable shell ou définir l' ignoreeofoption shell. Mettez l'un des éléments suivants dans votre .bashrcfichier:

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

set -o ignoreeof  # Same as setting IGNOREEOF=10
chepner
la source
6
C'est excellent, merci. Je ne avais besoin pour tmux si je set-environment -g 'IGNOREEOF' 2en .tmux.confet maintenant je dois frapper Ctrl-d 3 fois pour sortir et je suis également prévenu chaque fois avec le message: Use "logout" to leave the shell.
Cas
7
La définition de la variable d'environnement IGNOREEOF n'a aucun effet dans zsh, mais "set -o ignoreeof" ou "setopt ignoreeof" le fait.
sgtpep
12

IGNOREEOFn'a pas fonctionné pour moi donc j'ai juste lié Ctrl+ Dà detachdans .tmux.conf:

bind-key -n C-d detach

Les -nmoyens d'échappement aucune séquence préalable nécessaire, comme le préfixe tmux.

Rohmer
la source
Un an et demi plus tard, IGNOREOFcela ne fonctionnait pas pour moi avant depuis que j'utilise zsh. setopt ignoreeofen .zshrctravaux. Mais j'ai dû tuer toutes les sessions tmux pour que tmux soit source .zshrc. Peut-être que j'aurais pu .zshrcprovenir de tmux ...
Rohmer
1
J'ai utilisé cela, mais il a une limitation ennuyeuse: il se détache sur n'importe quel Ctrl + D, qu'il soit envoyé au shell ou à quelque chose comme cat > some_new_file.txt.
Mihai Danila
Cependant, cela a un effet secondaire dans tmux avec plus de volets ouverts car il ne vous permet pas de fermer un volet avec ^D.
M. Tao
MISE À JOUR Pour ceux qui veulent seulement garder la dernière fenêtre / volet: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 m'a appris à utiliser exec zshpour redémarrer zsh dans tmux lorsque je joue avec le .zshrc
krry
7

En plus de chepner réponse , vous pouvez arrêter le terminal d'envoyer EOF entièrement par la mise eofà undefavec stty:

stty eof undef

Réinitialiser avec:

stty eof '^d'
Thor
la source