Как я могу предотвратить выход tmux с помощью Ctrl-d?

30

Я использую tmux на своем сервере, и недавно я обнаружил, что ctrl-d выйдет из tmux и потеряет всю информацию о сеансе. Я собирался просто завершить сеанс ssh, но не заметил, что я все еще в tmux, пока не слишком поздно.

Я знаю, что в будущем я должен быть осторожен при использовании ctrl-d, но мне было интересно, есть ли способ предотвратить выход tmux при случайном нажатии ctrl-d? Такое решение, как подсказка, подтверждение или отключение, подойдет.

Cas
источник

Ответы:

36

Если быть точным, то Ctrldне выход tmux, а скорее оболочка. Если эта оболочка работает на единственной панели последнего окна tmuxсеанса, сеанс завершается, и tmuxклиент завершает работу.

Чтобы предотвратить Ctrldвыход из оболочки, вы можете установить IGNOREEOFпеременную оболочки или установить параметр ignoreeofоболочки. Поместите одно из следующего в ваш .bashrcфайл:

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

set -o ignoreeof  # Same as setting IGNOREEOF=10
chepner
источник
6
Это отлично, спасибо. Я только нуждался в tmux так что я использовал set-environment -g 'IGNOREEOF' 2в .tmux.confи теперь мне нужно ударить Ctrl-D в 3 раза , чтобы выйти , и я также предупредил , каждый раз с сообщением: Use "logout" to leave the shell.
Cas
7
Задание переменной окружения IGNOREEOF не влияет на zsh, но "set -o ignoreeof" или "setopt ignoreeof" делает.
sgtpep
12

IGNOREEOFу меня не сработало, поэтому я просто привязал Ctrl+ Dк detach.tmux.conf:

bind-key -n C-d detach

В -nни в коем случае перед последовательность выхода не требуется, как и tmux префикс.

Ромер
источник
Полтора года спустя IGNOREOFу меня ничего не вышло, так как я использую zsh. setopt ignoreeofв .zshrcработах. Но мне пришлось убить все сеансы tmux для tmux к источнику .zshrc. Может быть, я мог бы получить .zshrcизнутри tmux ...
Rohmer
1
Я использовал это, но у него есть раздражающее ограничение: он отключается при любом нажатии Ctrl + D, независимо от того, отправляется ли он в оболочку или что-то в этом роде cat > some_new_file.txt.
Михай Данила
Это, однако, имеет побочный эффект в tmux с большим количеством открытых панелей, так как не позволяет закрыть панель с помощью ^D.
г-н Тао
ОБНОВЛЕНИЕ Для тех, кто хочет сохранить только последнее окно / панель: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'
Фредерик Чжан
1
@Rohmer, prezto научил меня использовать exec zshдля перезапуска zsh в tmux, когда я играю с .zshrc
krry
7

Помимо ответа Чепнера, вы можете запретить терминалу отправлять EOF полностью, установив eofс undefпомощью stty:

stty eof undef

Сброс с:

stty eof '^d'
Тор
источник