Como posso impedir que o tmux saia com o Ctrl-d?


30

Eu uso o tmux no meu servidor e, recentemente, descobri que o ctrl-d sairá do tmux e perderá todas as informações da sessão, minha intenção era simplesmente encerrar a sessão ssh, mas não percebi que ainda estava no tmux até muito tarde.

Estou ciente de que devo ter cuidado no futuro ao usar o ctrl-d, mas me perguntei se havia uma maneira de impedir que o tmux saísse ao pressionar o ctrl-d por acidente? Uma solução como solicitação, confirmação ou desanexação seria adequada.

Respostas:


35

Para ser preciso, Ctrldnão sai tmux, mas sim uma concha. Se esse shell estiver sendo executado no único painel da última janela da tmuxsessão, a sessão será encerrada e o tmuxcliente sairá.

Para impedir a Ctrldsaída do shell, você pode definir a IGNOREEOFvariável do shell ou definir a ignoreeofopção do shell. Coloque um dos seguintes em seu .bashrcarquivo:

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

set -o ignoreeof  # Same as setting IGNOREEOF=10

6
Isso é excelente, obrigado. Eu só precisava para tmux então eu usei set-environment -g 'IGNOREEOF' 2no .tmux.confe agora eu preciso para bater Ctrl-d 3 vezes para sair e eu também estou avisado cada vez com a mensagem: Use "logout" to leave the shell.
Cas

7
A configuração da variável de ambiente IGNOREEOF não tem efeito no zsh, mas "set -o ignoreeof" ou "setopt ignoreeof" ocorre.
Sgtpep

11

IGNOREEOFfez não trabalho para mim, então eu só limite Ctrl+ Dpara detachem .tmux.conf:

bind-key -n C-d detach

Os -nmeios nenhuma sequência de escape antes necessário, como o tmux prefixo.


Um ano e meio depois, IGNOREOFnão funcionou para mim antes, pois estou usando o zsh. setopt ignoreeofem .zshrcobras. Mas eu tive que matar todas as sessões do tmux para que o tmux fosse fonte .zshrc. Talvez eu pudesse ter originado .zshrcde dentro tmux ...
Rohmer

1
Eu tenho usado isso, mas tem uma limitação irritante: desanexa em qualquer Ctrl + D, esteja sendo enviado para o shell ou algo assim cat > some_new_file.txt.
Mihai Danila

Isso, no entanto, tem um efeito colateral no tmux com mais painéis abertos, pois não permite fechar um painel ^D.
Sr. Tao

ATUALIZAÇÃO Para aqueles que querem apenas manter a última janela / painel: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, o prezto me ensinou a usar o exec zshreinício do zsh no tmux quando estou jogando com o .zshrc
krry

6

Além do chepner resposta que você pode parar o terminal de enviar EOF completamente, definindo eofa undefcom stty:

stty eof undef

Redefinir com:

stty eof '^d'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.