Wie kann ich verhindern, dass tmux mit Strg-D beendet wird?

30

Ich benutze tmux auf meinem Server und vor kurzem stellte ich auf meine Kosten fest, dass ctrl-d tmux beendet und alle Sitzungsinformationen verliert. Ich wollte einfach die ssh-Sitzung beenden, bemerkte aber nicht, dass ich bis zu spät noch in tmux war.

Mir ist bewusst, dass ich in Zukunft vorsichtig sein sollte, wenn ich Strg-D verwende, aber ich habe mich gefragt, ob es eine Möglichkeit gibt, zu verhindern, dass TMUX beim versehentlichen Drücken von Strg-D beendet wird. Eine Lösung wie Aufforderung, Bestätigung oder Lösen wäre in Ordnung.

Cas
quelle

Antworten:

35

Um genau zu sein, Ctrldnicht verlassen tmux, sondern eine Muschel. Wenn diese Shell im einzigen Bereich des letzten Fensters der tmuxSitzung ausgeführt wird, wird die Sitzung beendet und der tmuxClient beendet.

Um das CtrldVerlassen der Shell zu verhindern , können Sie die IGNOREEOFShell-Variable oder die ignoreeofShell-Option festlegen . Fügen Sie eine der folgenden Angaben in Ihre .bashrcDatei ein:

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

set -o ignoreeof  # Same as setting IGNOREEOF=10
chepner
quelle
6
Das ist hervorragend, danke. Ich kann es nur für tmux benötigt , so habe ich set-environment -g 'IGNOREEOF' 2in .tmux.confund jetzt brauche ich Ctrl-d 3 mal Ausgang zu treffen , und ich bin auch jedes Mal mit der Meldung gewarnt: Use "logout" to leave the shell.
Cas
7
Das Setzen der Umgebungsvariablen IGNOREEOF hat in zsh keine Auswirkung, aber "set -o ignoreeof" oder "setopt ignoreeof".
Sgtpep
11

IGNOREEOFnicht für mich arbeiten , damit ich nur gebunden Ctrl+ Dan detachin .tmux.conf:

bind-key -n C-d detach

Die -nMittel keine vorherige Escape - Sequenz benötigt werden , wie die TMux Präfix.

Rohmer
quelle
Eineinhalb Jahre später hat IGNOREOFes bei mir nicht funktioniert, da ich zsh verwende. setopt ignoreeofin .zshrcArbeiten. Aber ich musste alle tmux-Sessions beenden, damit tmux als Quelle diente .zshrc. Vielleicht hätte ich etwas .zshrcaus tmux beziehen können ...
Rohmer
1
Ich habe dies verwendet, aber es hat eine ärgerliche Einschränkung: Es löst sich bei jedem Strg + D, ob es an die Shell oder an etwas Ähnliches gesendet wird cat > some_new_file.txt.
Mihai Danila
Dies hat jedoch einen Nebeneffekt in tmux, wenn mehr Fenster geöffnet sind, da Sie damit kein Fenster schließen können ^D.
Herr Tao
UPDATE Für diejenigen, die nur das letzte Fenster / Scheibe behalten möchten: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 lehrte prezto mich zu verwenden , exec zshinnerhalb tmux neu zu starten zsh , wenn ich spiele mit dem .zshrc
krry
6

Neben der Antwort von chepner können Sie das Terminal daran hindern, EOF vollständig zu senden, indem Sie eofauf undefmit setzen stty:

stty eof undef

Zurücksetzen mit:

stty eof '^d'
Thor
quelle