tmux 会话以不同的名称出现两次

tmux 会话以不同的名称出现两次

我刚刚遇到了一个与 tmux 相关的奇怪情况,我不确定这是否是一个错误,或者(更有可能)是我意外做的事情:

我有两个会议:

foo-0
foo-1

附加到它们tmux attach-session -t foo-[0/1]有效,但我在两种情况下都看到相同的结果。对一个会话所做的更改(关闭窗格、运行命令等)适用于另一个会话。

我用 创建了一个新的会话tmux new-session -t bar,并产生了一个与前两个会话没有任何共享内容的新会话。

是什么原因导致了这种现象?我该如何将两个会话“合并”为一个而不丢失它们?

答案1

这不是一个错误。

什么原因导致了这种现象?

在 tmux 中,您可以将任何窗口链接到多个会话。实际上,您可以拥有两个(或更多)会话,这些会话的窗口组完全相同,且顺序相同。在这种情况下,会话看起来相同。有两种可能性:

  1. 要么您创建了两个单独的会话,然后链接 ( link-window) 并排列 ( move-window) 窗口,这样会话看起来就一样了。我认为很难偶然做到这一点,所以可能不是这种情况。

  2. 或者你在同一个会话组new-session -t。如果使用而不是 ,则很容易做到这一点new-session -s。您的问题让我相信您使用的-t-s。我的其余回答探讨了这种可能性。


这是相关部分man 1 tmux

new-session [-AdDEP] [-c start-directory] [-F format] [-n window-name] [-s session-name] [-t group-name] [-x width] [-y height] [shell-command]

(别名new:)

创建一个名为 的新会话session-name

[…]

如果-t给出,则指定一个会话组。同一组中的会话共享同一组窗口 - 新窗口链接到组中的所有会话,任何关闭的窗口都会从所有会话中删除。当前和前一个窗口以及任何会话选项保持独立,并且组中的任何会话都可以被终止而不会影响其他会话。参数group-name可以是:

  1. 现有组的名称,在这种情况下,新会话将添加到该组;
  2. 现有会话的名称 - 新会话将添加到与该会话相同的组中,必要时创建一个新组;
  3. 仅包含新会话的新组的名称。

[…]

我的假设是,你想创建一个名为 的新会话foo。你误认为-t-s而不是tmux new-session -s foo你调用了

tmux new-session -t foo

foo是新组的名称。您没有提供session-nametmux在这种情况下,我会命名新会话foo-N并将其分配给新组foo。如果它是 tmux 服务器中的第一个会话,N则为。我认为这样你就得到了。0foo-0

然后你忘记了这个会话并调用再次

tmux new-session -t foo

foo是现有组的名称。您session-name也没有提供这个时间。该工具将新会话命名为foo-1

实际上,这两个会话位于同一个会话组中,它们的行为与手动状态类似。如果您不熟悉会话组,那么很容易将它们解释为一个以不同名称出现两次的会话。


我如何将两个会话“合并”为一个而不丢失它们?

终止所有分组会话,只保留一个。对于您的情况

tmux kill-session -t foo-1
# xor
# tmux kill-session -t foo-0

应该可以工作。通常,终止会话会终止其窗口(因此这些窗口中的窗格也会终止);但链接到幸存会话的任何窗口都将幸存。链接到属于会话组的会话的窗口链接到属于该组的所有会话。因此,只有终止组中的最后一个会话才会真正终止其窗口。


在终止任何会话之前,您可能需要确保相关会话确实位于同一会话组中。通常,它们可能共享一些窗口,但不是全部;或者它们只是看起来很相似。调用

tmux list-sessions

这将为您提供有关会话组(如果有)的信息。我预计两个会话(foo-0foo-1)都将报告(group foo)。这表明它们属于同一会话组。您可以请求自定义格式(-F)甚至查询特定会话的会话组。对于您的情况:

tmux display-message -p -t foo-0 '#{session_group}'
tmux display-message -p -t foo-1 '#{session_group}'

相关内容