![tmux 在命令行和等效配置文件 (.tmux.conf) 之间的行为不同](https://linux22.com/image/225564/tmux%20%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%92%8C%E7%AD%89%E6%95%88%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%20(.tmux.conf)%20%E4%B9%8B%E9%97%B4%E7%9A%84%E8%A1%8C%E4%B8%BA%E4%B8%8D%E5%90%8C.png)
tmux 在命令行和等效配置文件 (.tmux.conf) 之间的行为不同
命令行:
bash$ tmux new \; split-window -h \;
配置文件(.tmux.conf),(然后,在命令行中,我们只需键入“tmux”)
new
split-window -h
命令行版本在启动时很好地向我显示了一个拆分窗口,并且它仅创建一个会话。但是,配置文件版本的行为有所不同:
- 它创建 2 个会话,会话名称为“0”和“1”,而不仅仅是一个会话。
- 会话“0”具有分割窗口,与我在命令行版本中看到的相同。
- 会话“1”有一个完整窗口。
- 它在会话“1”处停止。
因此,在配置文件版本中,我终于在屏幕上到达会话“1”。如果我执行“退出”,然后附加会话 0,那么它会转到会话“0”,其结果与命令行版本相同。
或者,如果配置文件仅包含分割行:
split-window -h
然后当输入“tmux”时,它会在启动时显示一条错误消息:
.tmux.conf:1: no current target
并且没有分割窗口(因为分割窗口命令失败:正如我们所看到的,它抱怨配置的第一行没有当前目标。)
显然,命令行版本是我想要/需要的。
配置文件版本有什么问题吗?
答案1
区别在于tmux
编辑后手动输入的命令.tmux.conf
。
当您意识到并记住 tmux 服务器和每个 tmux 客户端是单独的进程时,tmux 的许多问题就会变得更容易理解。在某些情况下,客户端启动服务器。.tmux.conf
适用于服务器,不适用于客户端。
tmux
没有参数的行为就像tmux new-session
aka tmux new
。如果需要,它会启动一个 tmux 服务器。当 tmux 服务器启动时,它会.tmux.conf
在处理来自 tmux 客户端的请求之前进行解析。
因此,如果没有正在运行的服务器,您将tmux
创建一个 tmux 服务器并执行:
new-session # because of .tmux.conf
split-window -h # because of .tmux.conf
new-session # because this is the request from your client
您的客户端最终会附加到最后一个创建的会话new-session
,它隐式请求的那个。
如果您希望客户端附加到已创建的会话,请使用tmux attach-session
akatmux attach
或tmux a
。请注意,如果还没有 tmux 服务器,将尝试创建它,并且当最终处理来自客户端的请求时,attach-session
您将创建的会话将被视为“已创建”。.tmux.conf
这在文档:
如果没有启动服务器,
attach-session
将尝试启动它;除非在配置文件中创建会话,否则这将失败。
对于.tmux.conf
有问题的情况,您需要tmux a
(不仅仅是tmux
)附加到从文件中创建的会话。请注意,如果 tmux 服务器已经存在,它将不会.tmux.conf
再次解析,您tmux a
将尝试附加到某些现有会话(如果有)。
一些用户(包括我)更喜欢返回到现有会话,因此他们在 shell 中使用tmux new-session -A
或。tmux a || tmux
这些命令与您的.tmux.conf
.
如果您想split-window -h
运行任何新创建的会话,那么可以使用这样的挂钩:
set-hook -g session-created 'split-window -h'
(这是一个 tmux 命令,来自 shell tmux set-hook …
)。