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

jecbmhm3  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(107)

我试图设置鱼运行tmux,自动登录.所以我在config.fish文件的顶部添加了以下内容。

if status is-interactive
    exec tmux
end

字符串
但是现在如果我打开一个新的终端窗口,它会立即关闭。但在这里找到了这个答案

if status is-interactive
and not set -q TMUX
    exec tmux
end


显然,它所做的是,它还检查tmux是否尚未激活,但当我确定没有tmux会话处于活动状态时,这有什么帮助?我试图使用的第一个代码有什么问题?
让我添加在shell中运行第一个(不把它放在配置文件中)工作得很好。

whhtz7ly

whhtz7ly1#

当执行exec tmux时,它将shell进程替换为tmux。
然后Tmux将启动另一个shell,它读取其配置文件并...用tmux替换自身。然后它将启动另一个shell,后者读取其配置文件并将其自身替换为tmux。
这是个无限循环这就是为什么你需要检查tmux是否已经是父进程之一,设置$TMUX是一个指示(从技术上讲,任何旧进程都可以设置该变量,它不受保护或任何东西,建议不要这样做)。
它退出而不是实际上永远循环的原因是tmux检查$TMUX -如果你试图在tmux会话中运行tmux,它会告诉你:
会话应嵌套,请小心,取消设置$TMUX以强制
然后退出。于是:

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

因为前面的进程已经退出,所以外面的tmux也退出了--因为它是终端中的顶部进程(因为它曾经是fish),所以终端选项卡关闭。
但是,不管这是如何失败的,在不检查$TMUX的情况下这样做永远不会有任何意义。
你可以 * 看到如果你只是不断地启动tmux,而不是只在$TMUX没有设置的时候启动它-只在TMUX没有设置的时候启动它,然后清除它,会发生什么:

if set -q TMUX
    set -e TMUX
    exec tmux
end

字符串
当你启动TMUX=foo fish时,它会看到$TMUX被设置,擦除它,变成tmux。然后,Tmux将设置$TMUX并启动另一个fish,该fish将擦除$TMUX并成为另一个tmux。
这将使你的终端充满tmux底部栏的多个副本,实际上不允许你做任何事情!
因此,如果你尝试这样做,你应该保持一个单独的终端打开或有一个单独的登录shell,你可以用来停止它(通过删除行从config.fish再次)。一定要确保你有一种方法来删除它再次,这是一个有趣的实验,但可能,在正确的情况下,破坏你的能力,以启动一个终端

相关问题