¿Cómo puedo evitar que tmux salga con Ctrl-d?

30

Utilizo tmux en mi servidor y recientemente descubrí que ctrl-d saldrá de tmux y perderá toda la información de la sesión, mi intención era simplemente finalizar la sesión ssh pero no noté que todavía estaba en tmux hasta demasiado tarde.

Soy consciente de que debería tener cuidado en el futuro cuando use ctrl-d, pero me preguntaba si hay alguna manera de evitar que tmux salga al golpear ctrl-d por accidente. Una solución como un aviso, confirmación o separación estaría bien.

Cas
fuente

Respuestas:

36

Para ser precisos, Ctrldno sale tmux, sino más bien un caparazón. Si ese shell se ejecuta en el único panel de la última ventana de la tmuxsesión, la sesión finaliza y el tmuxcliente se cierra.

Para evitar Ctrldsalir del shell, puede establecer la IGNOREEOFvariable del shell o establecer la ignoreeofopción del shell. Ponga uno de los siguientes en su .bashrcarchivo:

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

set -o ignoreeof  # Same as setting IGNOREEOF=10
chepner
fuente
66
Eso es excelente, gracias. Sólo necesitaba para tmux así que utilicé set-environment -g 'IGNOREEOF' 2en .tmux.confy ahora tenga que pulsar Ctrl-d 3 veces a la salida y también estoy advertido cada vez con el mensaje: Use "logout" to leave the shell.
Cas
77
Establecer la variable de entorno IGNOREEOF no tiene ningún efecto en zsh, pero "set -o ignoreeof" o "setopt ignoreeof" sí.
sgtpep
12

IGNOREEOFno funcionó para mí, así que limité Ctrl+ Da detachen .tmux.conf:

bind-key -n C-d detach

Esto -nsignifica que no se necesita una secuencia de escape previa, como el prefijo tmux.

Rohmer
fuente
Un año y medio después, IGNOREOFno funcionaba para mí antes, ya que estoy usando zsh. setopt ignoreeofen .zshrcobras Pero tuve que matar todas las sesiones de tmux para que tmux lo buscara .zshrc. Tal vez podría haber provenido .zshrcde tmux ...
Rohmer
1
He estado usando esto, pero tiene una limitación molesta: se separa en cualquier Ctrl + D, ya sea que se envíe al shell o algo así cat > some_new_file.txt.
Mihai Danila
Sin embargo, esto tiene un efecto secundario en tmux con más paneles abiertos, ya que no le permite cerrar un panel con ^D.
Sr. Tao
ACTUALIZACIÓN Para aquellos que solo quieren mantener la última ventana / panel: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 me enseñó a usar exec zshpara reiniciar zsh dentro de tmux cuando estoy jugando con el .zshrc
krry
7

Además de chepner respuesta puede detener el terminal desde el envío de EOF en su totalidad mediante el establecimiento eofde undefcon stty:

stty eof undef

Restablecer con:

stty eof '^d'
Thor
fuente