如何防止 Tmux 关闭最后一个 shell?

如何防止 Tmux 关闭最后一个 shell?

在 Tmux 中,我经常启动新的 shell,并在需要它们执行的任务完成后关闭它们。有时我本想关闭一个窗口,但却关闭了最后一个剩余的 shell。这样我就只剩下一个普通的终端模拟器了。

我想使用 Ctrl-D 快速轻松地关闭 shell,但尽可能严格地阻止关闭最后一个剩余的 shell。因此,这个密切相关的问题不适合,因为它只会关闭全部shell 有点不方便,无法防止意外退出。我想要的不便只是为了最后剩下的壳。

有谁知道如何实现这一点?

答案1

另一个问题要求修改Ctrl+ D我的答案在那里可以根据您的情况进行调整,结果是:

stty eof '^T'
bind '"\C-d": "\C-x\C-t\C-x\C-d"'
bind -x '"\C-x\C-t": _exit_maybe'
_exit_maybe() { [ -n "$READLINE_LINE" ] && return
                [ "$(tmux list-windows | wc -l)" -gt 1 ] && exit
                [ "$(tmux list-panes | wc -l)" -gt 1 ]  && exit   
              }
bind '"\C-x\C-d": delete-char'

请阅读其他答案以了解主要技巧的解释。这里的功能不同。它的逻辑是:

  • 如果该行不为空,则不执行任何操作;
  • 否则如果有另一个窗口,则exit是 shell;
  • 否则,如果存在另一个窗格,exit则为外壳;
  • 否则不执行任何操作。

代码将影响单个 shell,即运行该代码的 shell,仅此而已。将其粘贴到你的shell 中~/.bashrc似乎是正确的做法。你可能想要改进解决方案:在更改+tmux的行为之前检查 shell 是否在内部,这样外部的 shell就不会受到影响。像这样:CtrlDtmux

if [ -n "$TMUX" ]; then
   # the above code here
fi

可能出现的问题:

  • 您询问的是“最后一个 shell”。我的代码阻止exitBash 进入最后一个窗口的最后一个窗格。这并不等效,尽管可能足够了。

  • 可能存在竞争条件。想象一下两个窗格,两个 shell。其中一个即将退出,而您在另一个 shell 中按下了Ctrl+ 。该函数“看到”即将退出的窗格,并让另一个 shell 退出。两个 shell 半同时退出。D

相关内容