我正在尝试设置fish run tmux,在登录时自动运行。所以我将以下内容添加到我的
config.fish
文件的顶部。
if status is-interactive
exec tmux
end
但现在如果我打开一个新的终端窗口,它会立即关闭。但在here找到了这个答案,它确实有效
if status is-interactive
and not set -q TMUX
exec tmux
end
显然它的作用是还检查 tmux 是否尚未激活,但是当我确定没有 tmux 会话处于活动状态以及我尝试使用的第一个代码有什么问题时,这有什么帮助。
让我补充一下,在 shell 中运行第一个(不将其放入配置文件中)效果很好。
当您执行
exec tmux
时,就会用 tmux 替换 shell 进程。
Tmux 然后将启动另一个 shell,该 shell 读取其配置文件并......用 tmux 替换自身。 然后它将启动另一个 shell,该 shell 读取其配置文件并用 tmux 替换自身。
这是一个无限循环。这就是为什么您需要检查 tmux 是否已经是父进程之一,设置 $TMUX 是一个指示(从技术上讲,任何旧进程都可以设置该变量,它不受保护或任何东西,建议不要这样做).
它退出而不是真正永远循环的原因是 tmux 检查 $TMUX - 如果你尝试在 tmux 会话内运行
tmux
它会告诉你:
会话应小心嵌套,取消设置 $TMUX 以强制
然后退出。所以:
因为主导进程已退出,所以外部 tmux 也退出 - 因为这是终端中的顶级进程(因为它曾经是鱼),所以终端选项卡将关闭。
但是无论如何失败,在不检查 $TMUX 的情况下执行此操作永远不会有任何意义。