我刚刚遇到了一个与 tmux 相关的奇怪情况,我不确定这是否是一个错误,或者(更有可能)是我意外做的事情:
我有两个会议:
foo-0
foo-1
附加到它们tmux attach-session -t foo-[0/1]
有效,但我在两种情况下都看到相同的结果。对一个会话所做的更改(关闭窗格、运行命令等)适用于另一个会话。
我用 创建了一个新的会话tmux new-session -t bar
,并产生了一个与前两个会话没有任何共享内容的新会话。
是什么原因导致了这种现象?我该如何将两个会话“合并”为一个而不丢失它们?
答案1
这不是一个错误。
什么原因导致了这种现象?
在 tmux 中,您可以将任何窗口链接到多个会话。实际上,您可以拥有两个(或更多)会话,这些会话的窗口组完全相同,且顺序相同。在这种情况下,会话看起来相同。有两种可能性:
要么您创建了两个单独的会话,然后链接 (
link-window
) 并排列 (move-window
) 窗口,这样会话看起来就一样了。我认为很难偶然做到这一点,所以可能不是这种情况。或者你在同一个会话组
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
可以是:
- 现有组的名称,在这种情况下,新会话将添加到该组;
- 现有会话的名称 - 新会话将添加到与该会话相同的组中,必要时创建一个新组;
- 仅包含新会话的新组的名称。
[…]
我的假设是,你想创建一个名为 的新会话foo
。你误认为-t
,-s
而不是tmux new-session -s foo
你调用了
tmux new-session -t foo
这foo
是新组的名称。您没有提供session-name
。tmux
在这种情况下,我会命名新会话foo-N
并将其分配给新组foo
。如果它是 tmux 服务器中的第一个会话,N
则为。我认为这样你就得到了。0
foo-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-0
和foo-1
)都将报告(group foo)
。这表明它们属于同一会话组。您可以请求自定义格式(-F
)甚至查询特定会话的会话组。对于您的情况:
tmux display-message -p -t foo-0 '#{session_group}'
tmux display-message -p -t foo-1 '#{session_group}'