为什么在 config.fish 中包含 exec tmux 不起作用

问题描述 投票:0回答:1

我正在尝试设置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 中运行第一个(不将其放入配置文件中)效果很好。

shell tmux fish
1个回答
1
投票

当您执行

exec tmux
时,就会用 tmux 替换 shell 进程。

Tmux 然后将启动另一个 shell,该 shell 读取其配置文件并......用 tmux 替换自身。 然后它将启动另一个 shell,该 shell 读取其配置文件并用 tmux 替换自身。

这是一个无限循环。这就是为什么您需要检查 tmux 是否已经是父进程之一,设置 $TMUX 是一个指示(从技术上讲,任何旧进程都可以设置该变量,它不受保护或任何东西,建议不要这样做).


它退出而不是真正永远循环的原因是 tmux 检查 $TMUX - 如果你尝试在 tmux 会话内运行

tmux
它会告诉你:

会话应小心嵌套,取消设置 $TMUX 以强制

然后退出。所以:

  • 鱼变成 tmux
  • 设置 $TMUX
  • 开始另一条鱼
  • 这成为另一个 tmux
  • 拒绝,因为 $TMUX 已经设置并退出

因为主导进程已退出,所以外部 tmux 也退出 - 因为这是终端中的顶级进程(因为它曾经是鱼),所以终端选项卡将关闭。

但是无论如何失败,在不检查 $TMUX 的情况下执行此操作永远不会有任何意义。

© www.soinside.com 2019 - 2024. All rights reserved.