Jak mogę zapobiec wychodzeniu Tmuxa za pomocą Ctrl-d?

30

Używam tmux na moim serwerze i ostatnio odkryłem, że ctrl-d opuści tmux i utraci wszystkie informacje o sesji, moim zamiarem było po prostu zakończyć sesję ssh, ale nie zauważyłem, że wciąż jestem w tmuxie, aż będzie za późno.

Zdaję sobie sprawę, że powinienem zachować ostrożność w przyszłości, używając Ctrl-D, ale zastanawiałem się, czy istnieje sposób, aby zapobiec Tmuxowi przy wychodzeniu po przypadkowym naciśnięciu Ctrl-D? Rozwiązanie takie jak monit, potwierdzenie lub odłączenie byłoby w porządku.

Cas
źródło

Odpowiedzi:

35

Mówiąc dokładniej, Ctrldnie wychodzi tmux, ale raczej powłoka. Jeśli ta powłoka działa w jedynym okienku ostatniego okna tmuxsesji, sesja kończy się i tmuxklient kończy działanie.

Aby zapobiec Ctrldwychodzeniu z powłoki, możesz ustawić IGNOREEOFzmienną powłoki lub ustawić ignoreeofopcję powłoki. Umieść w .bashrcpliku jedną z następujących opcji :

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

set -o ignoreeof  # Same as setting IGNOREEOF=10
chepner
źródło
6
To wspaniale, dzięki. Potrzebowałem tylko go tmux więc użyłem set-environment -g 'IGNOREEOF' 2w .tmux.confa teraz muszę uderzyć Ctrl-D 3 razy do wyjścia, a ja też ostrzeżony za każdym razem z komunikatem: Use "logout" to leave the shell.
Cas
7
Ustawienie zmiennej środowiskowej IGNOREEOF nie ma wpływu na zsh, ale robi to „set -o ignoreeof” lub „setopt ignoreeof”.
sgtpep 24.04.13
11

IGNOREEOFnie działało dla mnie, więc po prostu związałem Ctrl+ Dz detach.tmux.conf:

bind-key -n C-d detach

Te -nśrodki nie przed sekwencja ucieczki potrzebne, podobnie jak tmux prefiksu.

Rohmer
źródło
Półtora roku później IGNOREOFnie działało dla mnie wcześniej, ponieważ używam zsh. setopt ignoreeofw .zshrcpracach. Ale musiałem zabić wszystkie sesje Tmux, aby Tmux mógł je pobrać .zshrc. Może mógłbym pozyskać .zshrcz tmux ...
Rohmer
1
Korzystałem z tego, ale ma irytujące ograniczenie: odłącza się na każdym Ctrl + D, niezależnie od tego, czy jest wysyłany do powłoki, czy do czegoś podobnego cat > some_new_file.txt.
Mihai Danila
Ma to jednak efekt uboczny w tmux przy większej liczbie otwartych okien, ponieważ nie pozwala zamknąć okna ^D.
Pan Tao
AKTUALIZACJA Dla tych, którzy chcą tylko zachować ostatnie okno / okienko: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 nauczył mnie, jak exec zshzrestartować Zsh w tmuxie, gdy gram z .zshrc
krry
6

Poza chepner za odpowiedź można zatrzymać terminal może wysyłać EOF całkowicie ustawiając eofsię undefz stty:

stty eof undef

Zresetuj za pomocą:

stty eof '^d'
Thor
źródło