在 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”。我的代码阻止
exit
Bash 进入最后一个窗口的最后一个窗格。这并不等效,尽管可能足够了。可能存在竞争条件。想象一下两个窗格,两个 shell。其中一个即将退出,而您在另一个 shell 中按下了Ctrl+ 。该函数“看到”即将退出的窗格,并让另一个 shell 退出。两个 shell 半同时退出。D