Tmux Docs
Tmux 是什么?
命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称 ” 窗口 ”),在里面输入命令。用户与计算机的这种临时的交互,称为一次 ” 会话 “(session) 。
会话的一个重要特点是,窗口与其中启动的进程是连在一起的:
- 打开窗口,会话开始;
- 关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。
一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。
为了解决这个问题,会话与窗口可以 ” 解绑 “:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话 ” 绑定 ” 其他窗口。
Tmux 就是会话与窗口的 ” 解绑 ” 工具,将它们彻底分离。
Tmux 的标准定义是:
一个在 Unix 和类 Unix 系统上运行的终端复用器(terminal multiplexer)。它允许用户在单个终端窗口中同时访问多个终端会话。使用 Tmux,您可以创建、管理和控制多个终端会话,这些会话可以在后台运行,即使您断开了与服务器的连接也可以保持运行。这使得在服务器上同时运行多个终端会话变得更加高效和方便。Tmux 基本组件概念
Tmux 的核心组件分为三个:
- 会话 session
- 窗口 window
- 窗格 pane

下图是一个布局示意图

通常来说,一个用户只需要创建一个 session 即可。不同的任务可以在不同的 window 下完成。每个 window 可以按需要划分为若干个 pane 来辅助完成任务。
部署 Tmux
最简单的当然是 apt install tmux,不过这样安装的版本并不是最新版(但是完全不影响使用)。我个人喜欢手动编译,反正要不了多久。
首先准备编译环境:
sudo apt updatesudo apt install libevent-dev ncurses-dev build-essential bison pkg-config automakeTmux wiki 中没有提到 automake,但不排除有的机器,例如容器环境,没有该工具,所以多装一个保险。
然后编译构建:
git clone https://github.com/tmux/tmux.gitcd tmuxsh autogen.sh./configure && make这里是 git clone 的源码,而不是 release 发布的
tmux-xx.tar.gz,否则找不到autogen.sh
如何使用 Tmux
关于快捷键
Tmux 有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是 Ctrl + b,即先按下 Ctrl + b,快捷键才会生效。
举例来说,帮助命令的快捷键是 Ctrl + b + ?。它的用法是,在 Tmux 窗口中,先按下 Ctrl+b,再按下 ?,就会显示帮助信息。
然后,按下 ESC 键或 q 键,就可以退出帮助。
由于快捷键的数量太多,全部记住未必就真的“快捷”,个人认为部分指令的缩写也足够简洁明了(除非英语不太行),所以下文只会提到常用的快捷键。
一些 Reference:
会话
创建会话
# 创建一个名为 wym 会话tmux new -s wym执行后,会自动进入 wym session,并在终端下方进行亮绿色显示 [wym]。
在这个 session 中执行的命令,产生的任何输出都不会随着 ssh 连接的断开而丢失,即直接关闭终端程序或者网络突然断开,都不会影响当前的会话。
连接会话
当我们登录服务器并需要重新连接到之前的会话时,可以通过如下方式:
# 查看当前正在运行的会话tmux ls# -----输出如下-----wym: 1 windows (created Mon Apr 1 12:29:03 2024)yzh: 1 windows (created Fri Mar 29 09:52:33 2024)可以看见,当前有两个 tmux 会话,一个叫 wym,一个叫 yzh。我们需要重新连接到 wym 以继续之前的工作,执行:
# tmux attach (附上) -t (target, 目标) session_nametmux attach -t wym
# 也可以将 attach 简写为 attmux at -t wym- 如果退出会话前,有进程正在输出,则你会看到输出仍在进行或者已停止
- 之前执行的指令记录仍然存在
退出会话
其实“退出”叫做“分离/卸载”更合适,因为关键字是
detach
退出会话有两种方式:快捷键和指令
# 指令tmux detach
# 快捷键ctrl + b + d综上,一般的工作流程是:创建会话摸摸鱼,然后退出会话恰个饭,接着连接会话继续摸。。。
杀死会话
除非你确定这个 session 已经没用了,否则不要轻易这么做。
tmux kill-session -t <session-name>窗口
多个不同的任务,可以分别在不同的窗口内执行。例如 Window1 用来跑模型,Window2 用来看日志。
创建窗口
输入 tmux new 后按 Tab,就可以得到相应的提示信息。
# 指令(可以指定窗口的名称)tmux new-windows -n <window-name>
# 快捷键ctrl + b + c # c = create快捷键创建的窗口会使用当前的 shell 作为名称,例如 bash,zsh 等,无法自定义名称。
切换窗口
# 查看当前开启的窗口tmux lsw # lsw = list window# -----输出如下-----0: zsh (1 panes) [120x29] [layout cafd,120x29,0,0,0] @01: 2- (1 panes) [120x29] [layout cb00,120x29,0,0,3] @32: zsh* (1 panes) [120x29] [layout cb02,120x29,0,0,5] @4 (active)可以看见终端下方的高亮提示条内,其实是有相关辅助信息的,例如:
[wym] 0:zsh 1:zsh- 2:zsh*其中,[wym] 是当前的 session 名称,0,1,2 是三个 window 的编号。* 表示当前所处的时候 2 号 window,这和 tmux lsw 输出中的 active 所在行是对应的。- 表示上一个 window。
如果要切换窗口,也有两种方式:
# 指令:切换到0tmux select-window -t <target-window> # tmux select-window -t 0
# 快捷键ctrl + b + n # n = next,下一个窗口ctrl + b + p # p = previous,上一个窗口ctrl + b + w # w = window,可以在列表中选择要切换的窗口(推荐)杀死窗口
杀死的命令其实都差不多的,可以
tmux kill然后按Tab提示。
# 指令tmux kill-window -t <target-window>
# 快捷键ctrl + b + & # 杀死当前窗口,会问你 yes or no窗格
创建窗格
窗格其实就是把一个窗口(window)分割为多个小块,每个块就是一个 pane。
屏幕够大的话,非常 nice👍
那么怎么分割呢?很显然,水平方向可以分成左右两块,垂直方向可以分成上下两块。如果要分多块,就是在每个 pane 里继续上下左右分割,行成不规则形状。
# 水平分割tmux split-window -h # h = horizontally
# 垂直分割tmux split-window -v # v = vertically例如先后执行上面两句指令的话,你会得到这样一个布局:

切换窗格
显然,屏幕上有这么多块,需要来回切换。这里有若干种方式:
- 参见文末的开启鼠标控制一节。开启后,就可以进行符合直觉的鼠标点击切换了。
- 指令
- 快捷键
下面针对 2,3 两点进行介绍。
指令切换
# 查看当前 panetmux lsp # lsp = list pane
# 类似于上面的 select-window, pane 也可以 selecttmux select-pane -t <target-pane>快捷键
ctrl + b + % 垂直分割ctrl + b + " 水平分割ctrl + b + q 显示每个窗格是第几个,当数字出现的时候按数字几就选中第几个窗格杀死窗格
# 指令tmux kill-pane -t <target-pane>
# 快捷键ctrl + b + x 关闭窗格配置 Tmux
开启鼠标控制
# 创建Tmux配置文件vim ~/.tmux.conf
# 添加以下内容开启鼠标控制set -g mouse on
# 重载Tmux配置tmux source-file ~/.tmux.conf即时生效,无需重启 Tmux
中文显示异常
当 Tmux 的中文显示异常时(例如全部变为了下划线 _),可以尝试如下方式:
vim ~/.bashrc # 或者 vim ~/.zshrc# 添加如下内容export LANG=en_US.UTF-8# 生效环境变量source ~/.bashrc # 或者 source ~/.zshrc这个选项
.zshrc默认就有,只不过被注释掉了
也可以采用 -u 参数强制 Tmux 使用 utf8:
# 使用 tmux 时添加 -u 参数tmux -u new -s xxx或者干脆使用 alias:
alias tmux='tmux -u'如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时









