Làm cách nào tôi có thể ngăn tmux thoát bằng Ctrl-d?


30

Tôi sử dụng tmux trên máy chủ của mình và gần đây tôi phát hiện ra rằng ctrl-d sẽ thoát khỏi tmux và mất tất cả thông tin phiên, ý định của tôi chỉ đơn giản là kết thúc phiên ssh nhưng không nhận thấy tôi vẫn ở tmux cho đến khi quá muộn.

Tôi biết rằng tôi nên cẩn thận trong tương lai khi sử dụng ctrl-d nhưng tôi tự hỏi liệu có cách nào để ngăn tmux thoát ra khi gặp ctrl-d một cách tình cờ không? Một giải pháp như nhắc nhở, xác nhận hoặc tách ra sẽ ổn.

Câu trả lời:


35

Nói chính xác, Ctrldkhông thoát ra tmux, mà là một cái vỏ. Nếu shell đó đang chạy trong khung duy nhất của cửa sổ cuối cùng trong tmuxphiên, phiên kết thúc và tmuxmáy khách thoát.

Để ngăn không cho Ctrldthoát khỏi trình bao, bạn có thể đặt IGNOREEOFbiến shell hoặc đặt ignoreeoftùy chọn shell. Đặt một trong những điều sau đây trong .bashrctập tin của bạn :

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

set -o ignoreeof  # Same as setting IGNOREEOF=10

6
Đó là tuyệt vời, cảm ơn. Tôi chỉ cần nó cho tmux vì vậy tôi sử dụng set-environment -g 'IGNOREEOF' 2trong .tmux.confvà bây giờ tôi cần phải nhấn Ctrl-d 3 lần để thoát và tôi cũng đang cảnh báo mỗi lần với thông điệp: Use "logout" to leave the shell.
Cas

7
Đặt biến môi trường IGNOREEOF không có hiệu lực trong zsh, nhưng "set -o igneof" hoặc "setopt igneof" thì không.
sgtpep

11

IGNOREEOFkhông làm việc cho tôi vì vậy tôi chỉ ràng buộc Ctrl+ Dđể detachtrong .tmux.conf:

bind-key -n C-d detach

-nnghĩa là không có chuỗi thoát trước cần thiết, như tiền tố tmux.


Một năm rưỡi sau, tôi IGNOREOFđã không làm việc cho tôi trước đây vì tôi đang sử dụng zsh. setopt ignoreeoftrong .zshrccông trình. Nhưng tôi đã phải giết tất cả các phiên tmux để tmux vào nguồn .zshrc. Có lẽ tôi có thể có nguồn gốc .zshrctừ trong tmux ...
Rohmer

1
Tôi đã và đang sử dụng cái này, nhưng nó có một hạn chế khó chịu: nó tách ra trên bất kỳ Ctrl + D nào, cho dù nó được gửi đến shell hay đến một cái gì đó như cat > some_new_file.txt.
Mihai Danila

Tuy nhiên, điều này có tác dụng phụ trong tmux với nhiều cửa sổ mở hơn vì nó không cho phép bạn đóng một khung với ^D.
Ông Tao

CẬP NHẬT Dành cho những người chỉ muốn giữ cửa sổ / khung cuối cùng: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 đã dạy tôi sử dụng exec zshđể khởi động lại zsh trong tmux khi tôi chơi với
.zshrc

6

Bên cạnh chepner của câu trả lời, bạn có thể ngăn chặn các thiết bị đầu cuối gửi EOF hoàn toàn bằng cách thiết lập eofđể undefstty:

stty eof undef

Đặt lại với:

stty eof '^d'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.