Ubuntu 22.04 tmux 安装与命令参数详解
在 Ubuntu 22.04 上从零安装 tmux 3.2a(在线 apt 与离线 deb 两种方式),并逐条实测创建/分离/恢复会话、多窗口多面板操作、键绑定与配置文件的真实输出,附 tmux 3.2a 与 2.7 版本差异对照表与命令速查表
Ubuntu 22.04 tmux 安装与命令参数详解
目标:说明 tmux 这一终端复用器(terminal multiplexer)在 Ubuntu 22.04(amd64 / x86_64)上的完整安装(在线 apt 与离线 deb 两种方式)、创建/分离/恢复会话、多窗口多面板的创建切换关闭全流程、常用命令与参数的逐条实测结果,以及 tmux 3.2a 与 2.7 的真实版本差异,已在真实环境中逐条实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04 LTS(amd64 / x86_64)
- 工具版本:tmux 3.2a(Debian 包版本 3.2a-4ubuntu0.2,实测
tmux -V输出tmux 3.2a) - 终端尺寸:默认 80x24
- 安装来源仓库:Ubuntu 官方仓库 archive.ubuntu.com(jammy-updates/main,包 3.2a-4ubuntu0.2)
- 说明:本次采集日志未记录内核版本(uname -r)与 IP,故本节仅列出日志中可确证的信息,不臆造。交互帧提示符与状态栏中的主机名为测试环境标识;本机用户配置文件
~/.tmux.conf将窗口编号基线设为 1(base-index 1)、前缀键设为Ctrl-a,下文实测编号与键位均按该配置呈现。
二、工具概览
tmux 是一个运行在终端里的终端复用器(terminal multiplexer),由 Nicholas Marriott 开发、OpenBSD 社区持续维护,采用 ISC/BSD 类许可。它允许在一个终端窗口中同时运行并管理多个"会话(session)—窗口(window)—面板(pane)"层级结构,核心能力包括:
- 会话分离与恢复:在服务器上创建会话后可按前缀键
d分离(detach)而不中断其中运行的程序,稍后再用tmux attach -t 会话名恢复现场,是远程 SSH 工作的标配; - 多窗口多面板:一个会话内可开多个窗口(window),每个窗口可再水平/垂直分割成多个面板(pane),适合"编辑 + 编译 + 日志"同时盯看;
- 完全键盘化:所有操作可通过前缀键(默认
Ctrl-b)组合完成,也支持鼠标; - 脚本化:
tmux命令行本身即可完成建会话、开窗口、分割面板、向 pane 发送按键等操作,可写进部署脚本; - 可配置:系统级
/etc/tmux.conf与用户级~/.tmux.conf支持set -g全局选项定制。
Ubuntu 22.04 官方仓库自带 tmux 3.2a,直接 apt-get install 即可,无需添加第三方源。本文档下文所有命令均以 root 用户在本机终端执行;交互式界面(attach 后的画面)使用 script 以文本帧方式捕获,帧中的终端控制序列已剥离,仅保留稳定可见的内容。
三、在线安装
3.1 查看当前包状态
命令:dpkg -l tmux 查看 tmux 是否已安装及其精确包版本。
dpkg -l tmux
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-===============-============-=================================
ii tmux 3.2a-4ubuntu0.2 amd64 terminal multiplexer
说明:ii 表示已安装(installed),包全名为 tmux,版本 3.2a-4ubuntu0.2,架构 amd64。这是 Ubuntu 官方仓库中 tmux 上游 3.2a 的再打包版本。
3.2 在线安装 / 重装
命令:apt-get install -y tmux 在线安装;已安装时可用 apt-get install -y --reinstall tmux 强制重装(真实回显如下)。
apt-get install -y --reinstall tmux
Reading package lists...
Building dependency tree...
Reading state information...
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 10 not upgraded.
Need to get 428 kB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 tmux amd64 3.2a-4ubuntu0.2 [428 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 428 kB in 2s (190 kB/s)
(Reading database ... 10804 files and directories currently installed.)
Preparing to unpack .../tmux_3.2a-4ubuntu0.2_amd64.deb ...
Unpacking tmux (3.2a-4ubuntu0.2) over (3.2a-4ubuntu0.2) ...
Setting up tmux (3.2a-4ubuntu0.2) ...
说明:包体 428 kB,从 archive.ubuntu.com(jammy-updates/main,注意该修订包走 updates 通道)下载;debconf: delaying package configuration, since apt-utils is not installed 是本机未安装 apt-utils 时的正常提示,不影响安装结果。
3.3 在线安装后的版本验证
命令:tmux -V 与 dpkg -l tmux 验证安装版本。
tmux -V
tmux 3.2a
四、离线安装
离线场景(目标机无法联网)下,可在可联网机器上先把 deb 包下载下来,再拷贝到目标机用 dpkg -i 安装。tmux 依赖较少,主包即可独立安装。
4.1 下载 deb 包到指定目录
命令:apt-get install -y --download-only -o Dir::Cache::archives=<目录> tmux 只下载不安装,并用 -o 把缓存目录指到目标位置。注意:若本机包已是最新,apt 会直接提示无需下载(真实回显如下)。
mkdir -p /root/off-tmux
apt-get install -y --download-only -o Dir::Cache::archives=/root/off-tmux tmux
Reading package lists...
Building dependency tree...
Reading state information...
tmux is already the newest version (3.2a-4ubuntu0.2).
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
说明:已安装最新版时 --download-only 不会重复拉包。要强制重新下载到指定目录,追加 --reinstall:
apt-get install -y --download-only --reinstall -o Dir::Cache::archives=/root/off-tmux tmux
Reading package lists...
Building dependency tree...
Reading state information...
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 10 not upgraded.
Need to get 0 B/428 kB of archives.
After this operation, 0 B of additional disk space will be used.
Download complete and in download only mode
💡 说明:
Download complete and in download only mode表示只下载未安装;Need to get 0 B/428 kB是因为包体已在本机 apt 缓存中,直接从缓存复制到指定目录。
4.2 离线包清单
命令:ls 查看下载目录,确认 tmux 的 deb 已就位。
ls -la /root/off-tmux/
du -sh /root/off-tmux
total 432
drwxr-xr-x 3 root root 4096 Oct 6 16:01 .
drwx------ 1 root root 4096 Oct 6 16:35 ..
-rw-r----- 1 root root 0 Oct 6 16:01 lock
drwx------ 2 _apt root 4096 Oct 6 16:01 partial
-rw-r--r-- 1 root root 428388 Feb 6 2023 tmux_3.2a-4ubuntu0.2_amd64.deb
428K /root/off-tmux
说明:整个离线包目录共 428K,tmux_3.2a-4ubuntu0.2_amd64.deb(428388 字节)已确认在列;lock 与 partial/ 为 apt 缓存运行时的辅助文件。
4.3 离线安装
命令:dpkg -i 直接安装本地 deb 包(真实回显如下)。
cd /root/off-tmux && dpkg -i tmux_3.2a-4ubuntu0.2_amd64.deb
(Reading database ... 10804 files and directories currently installed.)
Preparing to unpack tmux_3.2a-4ubuntu0.2_amd64.deb ...
Unpacking tmux (3.2a-4ubuntu0.2) over (3.2a-4ubuntu0.2) ...
Setting up tmux (3.2a-4ubuntu0.2) ...
4.4 离线安装后的版本验证
tmux -V
tmux 3.2a
五、全部命令参数实测
以下是 tmux 3.2a 常用命令与参数的逐条实测。所有交互式界面输出均通过 script 捕获为文本帧;为保证终端类型,捕获命令统一为 script -qc "TERM=xterm tmux …"。本机 ~/.tmux.conf 将前缀键设为 Ctrl-a、窗口编号基线设为 1,下述实测(分离键、窗口编号)均受此配置影响,特此说明。
5.1 打印版本:-V
作用:输出 tmux 版本号后退出,用于确认安装版本。
tmux -V
tmux 3.2a
5.2 -h:帮助参数(3.2a 同样不支持)
作用:3.2a 与 2.7 一样没有 -h/--help 选项,误用时输出 usage 用法行并报错。
tmux -h
tmux: unknown option -- h
usage: tmux [-2CDlNuvV] [-c shell-command] [-f file] [-L socket-name]
[-S socket-path] [-T features] [command [flags]]
⚠️ 注意:3.2a 的 usage 比 2.7 多了
-D、-N、-T features三个选项(详见第六章对照表)。
5.3 创建分离会话:new -d -s <名>
作用:new 创建新会话;-d 表示 detached(分离模式,创建后立即返回终端);-s <名> 指定会话名。
tmux new -d -s web
(命令无输出,会话已创建)
说明:命令静默成功。此时 web 会话已在后台运行,即使当前终端关闭也不受影响。
5.4 列出会话:ls / list-sessions
作用:tmux ls 是 tmux list-sessions 的别名,列出所有会话。
tmux ls
web: 1 windows (created Tue Oct 6 16:36:40 2026)
tmux list-sessions
web: 1 windows (created Tue Oct 6 16:36:40 2026)
说明:输出依次为会话名 web、窗口数 1 windows、创建时间。注意 3.2a 的该输出不带 [80x24] 终端尺寸(2.7 带),见第六章。
5.5 恢复/挂载会话:attach -t <名> 与分离
作用:attach 把一个分离的会话挂回到当前终端(此时进入 tmux 界面,看到的是会话内当前窗口的画面与底部状态栏);分离用前缀键。
tmux attach -t web
root@d0b71a177c7c:/#
[web] 1:bash* "d0b71a177c7c" 16:37 06-Oct-26
说明:attach 后看到 pane 中的 shell 提示符与底部状态栏 [web] 1:bash* …(会话名 web、窗口 1、窗口名 bash、右侧时间)。提示符中的主机名为测试环境标识。
分离(detach):在 attach 界面按前缀键再按 d。本机前缀键被配置为 Ctrl-a(见 5.20),故分离为 Ctrl-a d(默认配置下是 Ctrl-b d,对应键表项 bind-key -T prefix d detach-client)。实测通过向 attach 客户端注入 Ctrl-a d 的字节序列触发分离,客户端正常退出后:
tmux ls
keep: 1 windows (created Tue Oct 6 16:38:26 2026)
说明:分离后 tmux ls 仍能列出会话 keep,且不再带 (attached) 标记——这就是"detach 后会话保持"的实证:会话与其中进程在后台继续运行,随时可再次 attach(server 进程实测持续存活)。
⚠️ 注意:
tmux send-keys -t web C-a d无法触发分离。send-keys 是向 pane 的输入队列投递按键,绕过客户端侧的前缀键解析,C-a会被 pane 里的 shell 当作普通控制字符处理,真实分离必须由 attach 的客户端按出组合键。
5.6 会话内环境变量:TMUX
作用:tmux 会向每个 pane 进程注入 TMUX 环境变量,格式为 socket路径,server进程ID,窗口索引,用于标识进程所属会话。
tmux new -d -s s8 "echo TMUX=\$TMUX; sleep 60"
tmux capture-pane -t s8 -p
TMUX=/tmp/tmux-0/default,10148,1
说明:socket 路径为 /tmp/tmux-0/default(root 用户默认 socket),10148 为 server 进程 ID,末尾数字为窗口索引相关标识。脚本中可用它判断当前进程是否运行在 tmux 内。
5.7 查询会话信息:display-message
作用:display-message -p 把指定格式串(支持 #{} 占位符)打印到标准输出,-t 指定目标会话/窗口/面板。
tmux display-message -t s8 -p "#S #I #P #{session_name} #{window_index}"
s8 1 0 s8 1
说明:#S/#{session_name} 为会话名 s8,#I/#{window_index} 为窗口索引 1(本机 base-index 1 生效,默认配置为 0),#P 为面板索引 0。
5.8 直接在 tmux 中执行命令:-c
作用:tmux -c <命令> 创建一个临时会话执行给定命令(等价于把命令交给一个 pane 运行),命令执行完会话即结束。
tmux -c "echo hello-from-ubuntu-tmux-c"
hello-from-ubuntu-tmux-c
说明:输出直接打印到当前终端,无需进入 tmux 界面,适合脚本里"借用 tmux 环境执行单条命令"的场景。
5.9 新建窗口与重命名:new-window / rename-window
作用:new-window 在会话中新建窗口(默认新窗口为活动窗口);-n <名> 指定窗口名;rename-window 重命名窗口。
tmux new-window -t web -n monitor
tmux rename-window -t web:0 main
tmux list-windows -t web
can't find window: 0
1: bash- (1 panes) [80x24] [layout b25d,80x24,0,0,0] @0
2: monitor* (1 panes) [80x24] [layout b25e,80x24,0,0,1] @1 (active)
说明:new-window -n monitor 成功创建窗口 2;rename-window -t web:0 报 can't find window: 0——因为本机 base-index 1,窗口编号从 1 开始、没有窗口 0(默认配置下窗口 0 存在,可用 -t web:0 定位)。list-windows 输出窗口索引、窗口名、面板数、尺寸、layout 与内部窗口 ID(@0/@1);* 表示活动窗口、- 表示非活动。
5.10 分割面板:split-window -h / -v 与 list-panes
作用:split-window 把当前面板一分为二;-h 水平分割(左右并排)、-v 垂直分割(上下叠放,-v 也是默认方向);-t 指定目标窗口/面板。先用正确的窗口索引 web:1:
tmux split-window -h -t web:1
tmux split-window -v -t web:1.1
tmux list-panes -t web:1
0: [40x24] [history 0/2000, 968 bytes] %0
1: [39x12] [history 0/2000, 579 bytes] %2
2: [39x11] [history 0/2000, 352 bytes] %3 (active)
说明:窗口 1 先被 -h 分成左右两块(40 列 + 39 列),右侧块再被 -v 上下分成 12 行 + 11 行,共 3 个面板,ID 为 %0/%2/%3;(active) 标记当前活动面板。面板编号规则:-t 窗口.面板,如 web:1.1 指窗口 1 的面板 1。若误用不存在的窗口(如 -t web:0),3.2a 会报 can't find window: 0。
5.11 切换面板与窗口:select-pane / select-window
作用:select-pane 切换活动面板、select-window 切换活动窗口,两者均无输出,用 list-windows/display-message 验证。
tmux select-pane -t web:1.0
tmux select-window -t web:1
tmux list-windows -t web
1: bash* (3 panes) [80x24] [layout 1680,80x24,0,0{40x24,0,0,0,39x24,41,0[39x12,41,0,2,39x11,41,13,3]}] @0 (active)
2: monitor- (1 panes) [80x24] [layout b25e,80x24,0,0,1] @1
tmux display-message -p "#{session_name}:#{window_index}.#{pane_index} active-pane=#{pane_active}"
web:1.0 active-pane=1
说明:切换后窗口 1 带 (active)、窗口 2 变 monitor-;display-message 确认当前活动面板为 1.0。layout 字段中的 {…} 嵌套结构即三面板布局的完整描述。
5.12 向面板发送按键与截屏:send-keys / capture-pane
作用:send-keys 把按键/字符串投递到指定 pane 的输入队列(Enter 表示回车键);capture-pane -p 把 pane 当前画面按文本打印到标准输出(相当于"截屏")。
tmux send-keys -t web:2 "echo hello-from-ubuntu-tmux" Enter
tmux capture-pane -t web:2 -p
root@d0b71a177c7c:/# echo hello-from-ubuntu-tmux
hello-from-ubuntu-tmux
root@d0b71a177c7c:/#
说明:capture-pane 捕获到 pane 中 shell 的画面:回显的命令行、执行输出与新的提示符。这对脚本巡检/自动化截图非常有用。
5.13 关闭窗口与会话:kill-window / kill-session
作用:kill-window -t 会话:窗口 关闭指定窗口(窗口内进程随之终止);kill-session -t 会话 关闭整个会话。
tmux kill-window -t web:2
tmux list-windows -t web
1: bash* (3 panes) [80x24] [layout 1680,80x24,0,0{40x24,0,0,0,39x24,41,0[39x12,41,0,2,39x11,41,13,3]}] @0 (active)
tmux kill-session -t cc
tmux ls
hold: 1 windows (created Tue Oct 6 16:39:41 2026)
说明:kill-window 后窗口 2 消失;kill-session 后该会话从列表消失(其余会话不受影响)。若关闭的是最后一个会话,server 随会话消亡,tmux ls 报 no server running on /tmp/tmux-0/default(实测:kill 最后会话后连接失败为 no server running,与 5.16 的 server exited unexpectedly 错误文本不同,见 6.2)。
5.14 多窗口多面板完整流程
把 5.3~5.13 串成一条完整操作链(新建会话 → 双窗口 → 分割面板 → 切换 → 关闭):
tmux new -d -s demo
tmux new-window -t demo -n monitor
tmux split-window -h -t demo:1
tmux split-window -v -t demo:1.1
tmux list-windows -t demo
1: bash- (1 panes) [80x24] [layout b25d,80x24,0,0,0] @0
2: monitor* (1 panes) [80x24] [layout b25e,80x24,0,0,1] @1 (active)
tmux list-panes -t demo:1
0: [40x24] [history 0/2000, 968 bytes] %0
1: [39x12] [history 0/2000, 579 bytes] %2
2: [39x11] [history 0/2000, 352 bytes] %3 (active)
tmux select-pane -t demo:1.0
tmux select-window -t demo:1
tmux list-windows -t demo
1: bash* (3 panes) [80x24] [layout 1680,80x24,0,0{40x24,0,0,0,39x24,41,0[39x12,41,0,2,39x11,41,13,3]}] @0 (active)
2: monitor- (1 panes) [80x24] [layout b25e,80x24,0,0,1] @1
tmux kill-window -t demo:2
tmux kill-session -t demo
tmux ls
no server running on /tmp/tmux-0/default
说明:完整走完「创建 → 加窗口 → 分割三面板 → 切换活动面板/窗口 → 关窗口 → 关会话」全流程,每一步的命令输出如上逐字实测。注意窗口编号从 1 开始(base-index 1),因此 split-window 与 select-pane 都使用 demo:1;关掉最后一个会话后 ls 报 no server running。
5.15 new -A:会话存在则恢复、不存在则创建
作用:new -A -s <名> 是"attach-or-create":会话不存在则创建并 attach,存在则直接 attach 已有会话(不新建),适合脚本/登录时"一命令回到现场"。
tmux new -A -s aa
(伪终端中执行:会话不存在,创建 aa 并进入 attach 界面)
tmux ls
aa: 1 windows (created Tue Oct 6 16:41:31 2026) (attached)
说明:aa 不存在 → 创建并 attach((attached))。再对已存在的会话执行:
tmux new -A -s hold
tmux ls
aa: 1 windows (created Tue Oct 6 16:41:31 2026)
hold: 1 windows (created Tue Oct 6 16:41:56 2026) (attached)
说明:不新建会话,直接 attach 已有 hold 会话(attach 帧中状态栏显示 [hold]),列表未出现第三个会话。注意:该命令在非终端环境(如脚本的管道中)执行会报 open terminal failed: not a terminal,必须在真实终端里使用。
5.16 关闭所有会话:kill-server
作用:kill-server 关闭当前 socket 上的全部会话与 server 进程。
tmux kill-server
tmux ls
server exited unexpectedly
说明:kill-server 本身无输出、退出码 0;随后 tmux ls 报 server exited unexpectedly(2.7 的同一场景报 no server running on /tmp/tmux-0/default,见第六章)。3.2a 还新增了 exit-empty on 选项:最后一个客户端断开且无剩余窗口时 server 自动退出。
5.17 自定义 socket:-L <名>
作用:-L socket-name 指定 socket 名称,使不同 tmux server 彼此隔离(常用于多实例/多租户场景)。注意 3.2a 与 2.7 一样,-L 接的是名称而非路径,实际 socket 落在 /tmp/tmux-<uid>/ 目录下。
tmux -L mysock new -d -s t1
tmux -L mysock ls
t1: 1 windows (created Tue Oct 6 16:41:19 2026)
tmux ls
hold: 1 windows (created Tue Oct 6 16:39:41 2026)
ls -l /tmp/tmux-0/
total 0
srw-rw---- 1 root root 0 Oct 6 16:39 default
srw-rw---- 1 root root 0 Oct 6 16:41 mysock
说明:-L mysock 的 server 与默认 server 并存互不影响,socket 文件分别名为 default 与 mysock。若误把绝对路径传给 -L,3.2a 与 2.7 行为一致——拼接到 socket 目录下导致失败:
tmux -L /tmp/mysock2 ls
error connecting to /tmp/tmux-0//tmp/mysock2 (No such file or directory)
⚠️ 注意:3.2a 同样不支持
-L绝对路径;如需完全自定义路径可用-S socket-path。
5.18 键绑定查看:list-keys
作用:list-keys 列出当前全部键绑定;-T <表> 只看指定键表(root / prefix / copy-mode 等)。默认 prefix 键表关键项(3.2a 与 2.7 一致,节选):
tmux list-keys -T prefix
bind-key -T prefix C-b send-prefix
bind-key -T prefix " split-window
bind-key -T prefix % split-window -h
bind-key -T prefix & confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key -T prefix , command-prompt -I "#W" "rename-window -- '%%'"
bind-key -T prefix c new-window
bind-key -T prefix d detach-client
bind-key -T prefix o select-pane -t :.+
bind-key -T prefix x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key -T prefix [ copy-mode
bind-key -T prefix ] paste-buffer
bind-key -T prefix n next-window
bind-key -T prefix p previous-window
bind-key -T prefix l last-window
bind-key -T prefix $ command-prompt -I "#S" "rename-session -- '%%'"
说明:Ctrl-b c 新窗口、Ctrl-b d 分离、Ctrl-b % 水平分割、Ctrl-b " 垂直分割、Ctrl-b o 在面板间切换、Ctrl-b n/p 切窗口,均与本节命令一一对应。list-keys 全量输出很长,copy-mode 表节选如下(前 25 行):
tmux list-keys
bind-key -T copy-mode C-Space send-keys -X begin-selection
bind-key -T copy-mode C-a send-keys -X start-of-line
bind-key -T copy-mode C-b send-keys -X cursor-left
bind-key -T copy-mode C-c send-keys -X cancel
bind-key -T copy-mode C-e send-keys -X end-of-line
bind-key -T copy-mode C-f send-keys -X cursor-right
bind-key -T copy-mode C-g send-keys -X clear-selection
bind-key -T copy-mode C-k send-keys -X copy-end-of-line
bind-key -T copy-mode C-n send-keys -X cursor-down
bind-key -T copy-mode C-p send-keys -X cursor-up
bind-key -T copy-mode C-r command-prompt -i -I "#{pane_search_string}" -p "(search up)" "send -X search-backward-incremental \"%%%\""
bind-key -T copy-mode C-s command-prompt -i -I "#{pane_search_string}" -p "(search down)" "send -X search-forward-incremental \"%%%\""
bind-key -T copy-mode C-v send-keys -X page-down
bind-key -T copy-mode C-w send-keys -X copy-pipe-and-cancel
bind-key -T copy-mode Escape send-keys -X cancel
bind-key -T copy-mode Space send-keys -X page-down
bind-key -T copy-mode , send-keys -X jump-reverse
bind-key -T copy-mode \; send-keys -X jump-again
bind-key -T copy-mode F command-prompt -1 -p "(jump backward)" "send -X jump-backward \"%%%\""
bind-key -T copy-mode N send-keys -X search-reverse
bind-key -T copy-mode R send-keys -X rectangle-toggle
bind-key -T copy-mode T command-prompt -1 -p "(jump to backward)" "send -X jump-to-backward \"%%%\""
bind-key -T copy-mode X send-keys -X set-mark
bind-key -T copy-mode f command-prompt -1 -p "(jump forward)" "send -X jump-forward \"%%%\""
bind-key -T copy-mode g command-prompt -p "(goto line)" "send -X goto-line \"%%%\""
5.19 运行状态与客户端:info / list-clients
作用:info 输出 server/client 运行详情(要求存在当前客户端);list-clients 列出当前连接到会话的客户端。
tmux info
no current client
说明:3.2a 与 2.7 一致,在无客户端连接时(所有会话都处于分离状态)tmux info 报 no current client——需在 attach 状态下才有完整输出。
tmux list-clients
(无输出:当前无客户端连接)
attach 状态下:
/dev/pts/2: cc [80x24 xterm] (attached,focused)
说明:list-clients 输出客户端终端设备 /dev/pts/2、会话名 cc、尺寸、TERM 与 (attached,focused) 标记(3.2a 新增该标记,2.7 无,见第六章)。分离后该命令无输出。
5.20 配置文件:/etc/tmux.conf 与 ~/.tmux.conf
作用:tmux 启动 server 时依次读取系统级 /etc/tmux.conf 与用户级 ~/.tmux.conf(用户级覆盖系统级同名选项),文件内以 set -g 选项 值 方式配置全局选项。3.2a 的 deb 包实测不含 /etc/tmux.conf(dpkg -L tmux 仅列出 /usr/bin/tmux、man、文档与 example_tmux.conf),系统级配置需自行创建。
先看本机用户级配置实测(~/.tmux.conf):
cat /root/.tmux.conf
set -g prefix C-a
set -g status-bg blue
set -g base-index 1
tmux show-options -g prefix
tmux show-options -g status
tmux show-options -g status-bg
tmux show-options -g status-left
prefix C-a
status on
status-bg blue
status-left "[#{session_name}] "
说明:~/.tmux.conf 生效后:前缀键从默认 Ctrl-b 改为 Ctrl-a(分离用 Ctrl-a d);状态栏背景为蓝色;窗口编号基线为 1(base-index 1,本篇 5.4/5.9/5.14 的编号均源于此);status on 为默认值(状态栏总开关),status-left "[#{session_name}] " 为 3.2a 的默认左侧显示格式(会话名占位符)。
再实测系统级配置:新建 /etc/tmux.conf 写入 set -g base-index 1(窗口编号从 1 开始),重启 server 后生效(此处与用户配置效果叠加验证):
echo "set -g base-index 1" > /etc/tmux.conf
tmux kill-server
tmux new -d -s cfg
tmux new-window -t cfg
tmux list-windows -t cfg
1: bash- (1 panes) [80x24] [layout b25d,80x24,0,0,0] @0
2: bash* (1 panes) [80x24] [layout b25e,80x24,0,0,1] @1 (active)
说明:kill-server 后新 server 启动时读取 /etc/tmux.conf,窗口编号从 1 开始(1: bash-、2: bash*),证明系统级配置生效。配置文件修改后需重启 server(或 tmux source-file)才生效。
六、常见问题与真实行为
6.1 现象:窗口编号不是从 0 开始,tmux rename-window -t web:0 报 can't find window: 0
原因:本机 ~/.tmux.conf 配置了 set -g base-index 1,窗口编号基线变为 1,不存在窗口 0。解决:按实际编号定位(web:1),或删掉 base-index 1 配置并重启 server 恢复 0 基线。这是环境配置导致的行为差异,不是版本缺陷。
6.2 现象:tmux kill-server 后 tmux ls 报 server exited unexpectedly;而 kill 掉最后一个会话后报 no server running
原因:server exited unexpectedly 是"客户端已连上 server、server 随后主动退出"时的报错(kill-server 命令即此路径);而 kill-session 关闭最后一个会话后 server 自动退出、socket 已清理,此时新发起的 ls 连接失败报 no server running on /tmp/tmux-0/default(实测退出码 1)。两者都是 server 不存在的正常状态提示。解决:直接 tmux new -d -s xxx 重建 server 即可。注意:2.7 没有 server exited unexpectedly 文本,kill-server 后也报 no server running,脚本判断时需区分,见 6.6。
6.3 现象:tmux -L /tmp/mysock2 报 error connecting to /tmp/tmux-0//tmp/mysock2
原因:3.2a(与 2.7)中 -L 参数是 socket 名称,tmux 自动拼接为 /tmp/tmux-<uid>/<名称>;传绝对路径会被拼成 /tmp/tmux-0//tmp/mysock2 而找不到。解决:-L 只写名字(如 -L mysock),需要完全自定义路径时改用 -S socket-path。
6.4 现象:tmux info 报 no current client
原因:info 需要"当前客户端"上下文;所有会话均处于分离状态(无客户端连接)时无法输出。解决:先 tmux attach -t 会话 进入 attach 界面再执行;或改用 tmux display-message -p "..." 查询结构化信息。
6.5 现象:tmux -h 报 unknown option -- h 并打印 usage
原因:tmux(3.2a 与 2.7)不提供 -h/--help 命令行参数,帮助请查阅 man tmux 或 tmux list-keys。副作用是误用时会把 usage 用法行打出来,正好可查看当前版本的选项全集。
6.6 版本差异对照表(Ubuntu 22.04 tmux 3.2a vs CentOS 8 tmux 2.7)
| 对比项 | Ubuntu 22.04(tmux 3.2a) | CentOS 8(tmux 2.7) |
|---|---|---|
| 版本号输出 | tmux 3.2a | tmux 2.7 |
tmux ls 会话输出 | 不带终端尺寸,如 web: 1 windows (created …) | 带终端尺寸,如 web: 1 windows (created …) [80x24] |
kill-server 后 ls 报错 | server exited unexpectedly | no server running on /tmp/tmux-0/default |
| usage 选项 | [-2CDlNuvV] [-c shell-command] [-f file] [-L socket-name] [-S socket-path] [-T features](多出 -D、-N、-T features) | [-2CluvV] [-c shell-command] [-f file] [-L socket-name] [-S socket-path] |
list-clients 输出 | /dev/pts/2: cc [80x24 xterm] (attached,focused)(带 (attached,focused) 标记) | /dev/pts/6: web [80x24 xterm](无标记) |
copy-mode C-w 绑定 | copy-pipe-and-cancel | copy-selection-and-cancel |
copy-mode \; 绑定 | jump-again(\; 转义格式) | jump-again(; 格式) |
exit-empty 选项 | 有,默认 on(最后一个客户端断开且无剩余窗口时 server 退出) | 无此选项 |
| 默认状态栏左侧 | status-left "[#{session_name}] " | status-left "[#S]"(受本机配置影响) |
| 默认窗口编号 | 从 0 开始(本机配置 base-index 1 故实测从 1 开始) | 从 0 开始(本机配置 base-index 1 故实测从 1 开始) |
| 包来源 | Ubuntu 官方仓库 jammy-updates/main | CentOS 8 BaseOS |
⚠️ 注意:两版核心命令(new/ls/attach/detach/split/select/kill/send-keys/capture-pane/display-message/-c/-A/-L)行为完全一致,跨版本差异主要出现在输出格式与错误文本上;
-h均不支持。exit-empty on是 3.2a 的新行为:最后一个客户端断开且无剩余窗口时 server 自动退出,脚本需注意。
七、命令与参数速查表
| 参数/命令 | 含义 | 实测说明/默认值 |
|---|---|---|
tmux -V | 打印版本 | 实测输出 tmux 3.2a |
tmux -h | 帮助参数 | 3.2a 不支持,报 unknown option -- h 并打印 usage |
tmux new -d -s <名> | 创建分离会话 | 静默创建;-d 分离、-s 会话名 |
tmux ls / list-sessions | 列出会话 | 输出含会话名/窗口数/创建时间(3.2a 无尺寸) |
tmux attach -t <名> | 恢复会话 | 进入 attach 界面,前缀键 d 分离 |
tmux send-keys -t <窗>.<面板> <键…> Enter | 向面板发送按键 | Enter 表示回车;前缀组合键无法借此触发 |
tmux capture-pane -t <窗> -p | 捕获面板画面文本 | 按文本打印,可脚本化"截屏" |
tmux new-window -t <会话> [-n <名>] | 新建窗口 | 默认新窗口为活动窗口 |
tmux rename-window -t <会话>:<窗> <名> | 重命名窗口 | 目标窗口必须存在(编号受 base-index 影响) |
tmux split-window -h / -v | 分割面板 | -h 左右、-v 上下(默认) |
tmux list-panes -t <窗> | 列出面板 | 输出尺寸/history/面板 ID(%0…) |
tmux select-pane -t <窗>.<面板> | 切换活动面板 | 静默;用 list-panes 验证 |
tmux select-window -t <会话>:<窗> | 切换活动窗口 | 静默;用 list-windows 验证 |
tmux list-windows -t <会话> | 列出窗口 | 含 layout 布局描述与内部 ID @N |
tmux kill-window -t <会话>:<窗> | 关闭窗口 | 窗口内进程随之终止 |
tmux kill-session -t <会话> | 关闭会话 | 会话全关后 server 随之退出 |
tmux display-message -p "#S #I #P" | 查询会话/窗口/面板信息 | 支持 #{} 占位符 |
tmux -c "<命令>" | 临时会话执行命令 | 执行完即结束,输出到当前终端 |
tmux new -A -s <名> | 存在则 attach、不存在则创建 | 需要真实终端 |
tmux kill-server | 关闭当前 socket 全部会话 | 之后 ls 报 server exited unexpectedly |
tmux -L <名称> | 自定义 socket 名称 | 落于 /tmp/tmux-0/ 下;-L 不支持绝对路径 |
tmux list-keys [-T <表>] | 查看键绑定 | 默认前缀 Ctrl-b |
tmux info / list-clients | 运行状态 / 客户端 | 无客户端时 info 报 no current client |
set -g <选项> <值> | 配置文件全局选项 | /etc/tmux.conf 系统级、~/.tmux.conf 用户级 |
tmux show-options -g <选项> | 查看全局选项值 | 默认 prefix C-b、status on |
apt-get install -y tmux | 在线安装 | 源为 archive.ubuntu.com jammy-updates/main |
apt-get install -y --download-only -o Dir::Cache::archives=<目录> tmux | 离线只下载不安装 | 已最新时需加 --reinstall 强制下载 |
dpkg -i tmux_3.2a-4ubuntu0.2_amd64.deb | 离线安装本地 deb | 实测回显见第四章 |
八、卸载方式
在线安装的 tmux 使用 apt-get 卸载:
apt-get remove -y tmux
如需连同配置文件一起彻底清除:
apt-get purge -y tmux
离线场景(使用 dpkg -i 安装)可先用 dpkg -l tmux 确认包状态,再执行上述 apt-get remove/purge,或直接 dpkg -r tmux。卸载后可用 which tmux 或 tmux -V 确认已移除。
💡 说明:tmux 无守护进程与开机自启项,卸载后无需清理服务;其用户配置位于
~/.tmux.conf,系统配置位于/etc/tmux.conf(本机实测默认不存在),如彻底清理需一并删除;运行中的 tmux 会话需先tmux kill-server或逐个tmux kill-session关闭。