tmux 终端复用器完整入门指南
一、概述
1. 简介
A. 是什么
tmux 是一个终端复用器(terminal multiplexer),它在一个终端中运行,并允许在内部运行多个其他终端程序。tmux 为每个内部程序管理独立的终端,可以从单个运行 tmux 的终端访问这些程序。这种技术称为多路复用,tmux 就是一个终端多路复用器。
B. 为什么学
- 保护远程服务器上运行的程序免受连接断开影响
- 允许多台不同本地计算机访问远程服务器上运行的程序
- 在一个终端中同时使用多个程序和 shell,类似于窗口管理器
- 提高工作效率,实现复杂的终端工作流管理
C. 学完能做什么
- 在 tmux 中创建和管理多个会话、窗口和面板
- 在不同位置之间无缝切换工作环境
- 实现程序的持久化运行,不受网络断线影响
- 高效利用终端空间,进行多任务并行操作
2. 前置知识
A. 必备技能
- 熟悉基本 Linux/Unix 命令行操作
- 了解 ssh 远程登录
- 理解终端和 shell 的基本概念
B. 推荐知识
- 了解进程管理概念
- 熟悉 vim 或 emacs 编辑器(用于后续配置)
二、环境准备
1. 系统要求
- Linux:Ubuntu、Debian、CentOS、RHEL 等
- macOS:10.15 及以上版本
- BSD:OpenBSD、FreeBSD 等
2. 安装步骤
Ubuntu/Debian
sudo apt update
sudo apt install tmuxmacOS
brew install tmuxCentOS/RHEL
sudo yum install tmux从源码编译
访问 https://github.com/tmux/tmux/wiki/Installing 获取详细编译安装指南。
3. 验证安装
tmux -V三、核心概念
1. 基本术语
tmux 服务器和客户端
- tmux 服务器:单个主进程,在后台运行,管理 tmux 内的所有程序
- 客户端:连接到服务器的终端实例,通过 /tmp 目录下的套接字文件通信
层次结构
tmux 服务器
├── 会话 (Session)
└── 窗口 (Window)
└── 面板 (Pane)
└── 终端 + 运行的程序2. 工作原理
graph TB
subgraph 外部终端
A[客户端1]
B[客户端2]
end
subgraph tmux服务器
C[会话1]
D[会话2]
E[窗口1]
F[窗口2]
G[面板1]
H[面板2]
end
A -->|附加| C
B -->|附加| C
C --> E
C --> F
E --> G
E --> H3. 术语汇总表
| 术语 | 描述 |
|---|---|
| Client | 从外部终端(如 xterm)附加 tmux 会话 |
| Session | 将一个或多个窗口分组在一起 |
| Window | 将一个或多个面板分组在一起,链接到一个或多个会话 |
| Pane | 包含终端和运行程序,出现在一个窗口中 |
| Active pane | 当前窗口中输入被发送的面板,每个窗口一个 |
| Current window | 附加会话中显示的窗口,每个会话一个 |
| Last window | 上一个当前窗口 |
| Window layout | 窗口中面板的大小和位置 |
四、快速上手
1. 创建第一个会话
基本创建
tmux new这会创建一个新会话并自动附加。第一个会话默认命名为"0",第二个为"1",以此类推。
命名会话
tmux new -s mysession运行特定命令
tmux new 'emacs ~/.tmux.conf'或使用:
tmux new -- emacs ~/.tmux.conf命名窗口
tmux new -n mytopwindow top2. 状态行说明
当 tmux 客户端附加时,屏幕底部会显示绿色状态行,包含:
- 左侧:附加会话的名称,如 [0]
- 中间:会话中的窗口列表,显示索引和名称,如 0:ksh
- 右侧:面板标题(引号中)、时间和日期
在窗口列表中:
- 当前窗口用 * 标记
- 上一个窗口用 - 标记
- 窗口过多时会出现 < 或 > 表示有隐藏窗口
3. 前缀键
tmux 使用前缀键(prefix key)来区分发送给程序的输入和控制 tmux 的命令。
默认前缀键
默认前缀键是 C-b(Ctrl+b),表示同时按 Ctrl 和 b 键。
修饰键表示
- C-:Control 键
- M-:Meta 键(现代计算机上通常是 Alt)
- S-:Shift 键
这些可以组合使用,例如 C-M-x 表示同时按 Ctrl、Alt 和 x。
使用示例
C-b c 表示:按 Ctrl+b,释放后按 c
C-b C-c 表示:按住 Ctrl,同时按 b 和 c按两次 C-b 会将 C-b 发送到活动面板的程序。
4. 获取帮助
查看所有键绑定
按 C-b ? 进入查看模式,显示所有键绑定及其说明。
查看单个键说明
按 C-b / 然后按任意键查看该键的说明。
从命令行查看
tmux lsk -N | more5. 附加和分离
分离会话
按 C-b d 分离会话,返回 shell,tmux 会话和程序继续在后台运行。
重新附加
# 附加到最近使用的会话
tmux attach
# 附加到指定会话
tmux attach -t mysession
# 附加并分离其他客户端
tmux attach -dt mysession智能附加
# 会话存在则附加,不存在则创建
tmux new -As mysession6. 列出会话
tmux ls输出示例:
1: 3 windows (created Sat Feb 22 11:44:51 2020)
2: 1 windows (created Sat Feb 22 11:44:51 2020)
mysession: 1 windows (created Sat Feb 22 11:44:51 2020)五、窗口和面板操作
1. 创建新窗口
键盘快捷键
- C-b c:创建新窗口(成为当前窗口)
命令提示符方式
# 创建窗口但不切换
:neww -d mynewwindow
# 在指定索引创建窗口
:neww -t999
# 运行特定命令
:neww top2. 分割窗口(创建面板)
水平分割
C-b % 将当前面板水平分割为左右两个面板。
垂直分割
C-b " 将当前面板垂直分割为上下两个面板。
命令选项
# -h 水平分割,-v 垂直分割
:split-window -h
# -d 不改变活动面板
:split-window -d
# -f 新面板跨整个窗口宽度或高度
:split-window -f
# -b 将新面板放在左侧或上方
:split-window -b3. 切换窗口
| 快捷键 | 功能 |
|---|---|
| C-b 0 到 C-b 9 | 切换到窗口 0-9 |
| C-b ' | 提示输入窗口索引并切换 |
| C-b n | 切换到下一个窗口 |
| C-b p | 切换到上一个窗口 |
| C-b l | 切换到最后一个窗口 |
4. 切换面板
| 快捷键 | 功能 |
|---|---|
| C-b Up/Down/Left/Right | 切换到上/下/左/右侧面板 |
| C-b q | 短暂显示面板编号,按数字键切换 |
| C-b o | 按面板编号移动到下一个面板 |
| C-b C-o | 与下一个面板交换位置 |
5. 调整面板大小
小步调整
C-b C-Left/Right/Up/Down
大步调整
C-b M-Left/Right/Up/Down
缩放面板
C-b z 将活动面板临时放大占满整个窗口,再次按恢复原状。
6. 窗口布局
切换布局
C-b Space 在预设布局之间循环切换。
直接选择布局
- C-b M-1:even-horizontal(水平均匀分布)
- C-b M-2:even-vertical(垂直均匀分布)
- C-b M-3:main-horizontal(一个大面板在顶部,其余水平分布)
- C-b M-4:main-vertical(一个大面板在左侧,其余垂直分布)
- C-b M-5:tiled(平铺布局)
graph TB
subgraph 预设布局类型
A[even-horizontal]
B[even-vertical]
C[main-horizontal]
D[main-vertical]
E[tiled]
end
A --> F[C-b M-1]
B --> G[C-b M-2]
C --> H[C-b M-3]
D --> I[C-b M-4]
E --> J[C-b M-5]六、高级功能
1. 树模式(Tree Mode)
树模式用于浏览和选择会话、窗口和面板。
进入树模式
- C-b s:仅显示会话,选中当前附加的会话
- C-b w:展开显示会话和窗口,选中当前窗口
树模式操作
| 键 | 功能 |
|---|---|
| Enter | 切换到选中项 |
| Up/Down | 选择上一项/下一项 |
| Right | 展开项 |
| Left | 折叠项 |
| t | 标记/取消标记项 |
| x | 杀死选中项 |
| X | 杀死所有标记项 |
| q | 退出树模式 |
2. 客户端模式
查看和管理附加到 tmux 的客户端。
进入客户端模式
C-b D(即 C-b S-d)
客户端模式操作
| 键 | 功能 |
|---|---|
| Enter | 分离选中的客户端 |
| d | 分离选中的客户端 |
| D | 分离所有标记的客户端 |
| x | 分离并尝试杀死启动客户端的 shell |
3. 复制和粘贴
进入复制模式
C-b [ 进入复制模式,冻结面板输出。
emacs 风格按键
| 键 | 功能 |
|---|---|
| Up/Down/Left/Right | 移动光标 |
| C-Space | 开始选择 |
| C-w | 复制选择并退出 |
| q | 退出复制模式 |
| C-a/e | 移动到行首/行尾 |
| C-r | 向后搜索 |
| M-f/b | 移动到下一个/上一个单词 |
粘贴
- C-b ]:粘贴最近复制的文本
- C-b =:进入缓冲区模式,选择历史缓冲区粘贴
缓冲区管理
# 重命名缓冲区
:setb -bbuffer0 -nmybuffer
# 创建新缓冲区
:setb -bfoo bar
# 从文件加载
:loadb -bbuffername ~/file.txt
# 保存到文件
:saveb -bbuffer0 ~/saved_buffer4. 查找功能
C-b f 提示输入文本,然后进入树模式,仅显示包含该文本的面板。
5. 鼠标支持
启用鼠标
:set -g mouse on鼠标操作
- 左键点击面板:切换活动面板
- 左键点击状态栏窗口名:切换当前窗口
- 拖动面板边框:调整面板大小
- 在面板内拖动:选择文本
- 右键点击:打开命令菜单
七、配置 tmux
1. 配置文件
文件位置
~/.tmux.conf
重要说明
配置文件仅在 tmux 服务器启动时执行,而非创建新会话时。
重新加载配置
:source ~/.tmux.conf2. 配置文件语法
基本规则
- 每行一个命令
- 以 # 开头的行是注释
- 支持引号和转义
示例配置
# 这是注释
set -g status off
# 参数可以用引号包含空格
set -g status-left "hello word"
# 或使用转义
set -g status-left hello\ word
# 波浪号展开为家目录
source ~/myfile
# 环境变量
MYFILE=myfile
source "~/$MYFILE"3. 键绑定配置
键表(Key Tables)
- root:无前缀键的键绑定
- prefix:前缀键后的键绑定
- copy-mode:emacs 风格复制模式键绑定
- copy-mode-vi:vi 风格复制模式键绑定
绑定新键
# 在配置文件中
bind M-0 selectw -t:=10
# 解除绑定
unbind M-0更改前缀键
# 将前缀键改为 C-a
unbind C-b
set -g prefix C-a
bind C-a send-prefix4. 常用配置示例
# 基本设置
set -g default-terminal "screen-256color"
set -g history-limit 10000
set -g mouse on
# 状态栏设置
set -g status-interval 1
set -g status-justify centre
set -g status-left-length 100
set -g status-right-length 60
# 窗口和面板索引从 1 开始
set -g base-index 1
setw -g pane-base-index 1
# 自动重命名窗口
setw -g automatic-rename on
# 更容易的键绑定
bind c new-window -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"八、常用命令速查
1. 会话管理
| 命令 | 功能 |
|---|---|
| tmux new -s name | 创建命名会话 |
| tmux ls | 列出所有会话 |
| tmux attach -t name | 附加到指定会话 |
| tmux kill-session -t name | 杀死指定会话 |
| tmux kill-server | 杀死 tmux 服务器 |
2. 窗口管理
| 命令 | 功能 |
|---|---|
| :neww | 创建新窗口 |
| :neww -n name | 创建命名窗口 |
| :selectw -t n | 切换到窗口 n |
| :movew -t n | 移动窗口到索引 n |
| :killw | 杀死当前窗口 |
3. 面板管理
| 命令 | 功能 |
|---|---|
| :split-window | 水平分割 |
| :split-window -h | 垂直分割 |
| :selectp -t n | 选择面板 n |
| :killp | 杀死当前面板 |
| :resize-pane -D 10 | 向下调整 10 行 |
4. 配置命令
| 命令 | 功能 |
|---|---|
| :set option value | 设置选项 |
| :set -g option value | 设置全局选项 |
| :show-options | 显示选项 |
| :list-keys | 列出键绑定 |
九、实战案例
1. 远程服务器开发环境
场景描述
在远程服务器上进行开发,需要同时运行编辑器、编译器和多个 shell。
操作步骤
- ssh 连接到远程服务器
- 启动 tmux:tmux new -s dev
- 第一个窗口运行编辑器:vim main.c
- C-b c 创建新窗口运行编译器
- C-b " 垂直分割,上半部分运行测试
- C-b d 分离会话,下班回家
- 从家里重新连接:ssh server && tmux attach -t dev
效果
- 工作状态完全保留
- 不受网络断线影响
- 多处无缝切换
2. 监控多台服务器
场景描述
同时监控多台服务器的系统状态。
操作步骤
- 创建 tmux 会话:tmux new -s monitor
- C-b % 垂直分割为多个面板
- 在每个面板中 ssh 到不同服务器
- 每个面板运行 top 或 htop
- C-b Space 切换不同布局视图
3. 配置文件模板
完整 ~/.tmux.conf
# === 基本设置 ===
set -g default-terminal "screen-256color"
set -g history-limit 20000
set -g mouse on
set -g renumber-windows on
set -g set-titles on
set -g set-titles-string "#T"
# === 前缀键 ===
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# === 索引从 1 开始 ===
set -g base-index 1
setw -g pane-base-index 1
# === 状态栏 ===
set -g status on
set -g status-interval 1
set -g status-justify left
set -g status-left '[#S] '
set -g status-left-length 20
set -g status-right '%Y-%m-%d %H:%M:%S'
set -g status-right-length 30
# === 窗口 ===
setw -g automatic-rename on
setw -g monitor-activity on
set -g visual-activity on
# === 面板 ===
setw -g pane-border-status top
setw -g pane-border-format "#{pane_index} #{pane_current_command}"
# === 键绑定 ===
bind c new-window -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind -n M-Left selectw -t :-
bind -n M-Right selectw -t :+
bind -n M-Up selectp -t :-
bind -n M-Down selectp -t :+
# === 复制模式(vi 风格)===
setw -g mode-keys vi
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-pipe "xclip -selection clipboard"十、常见问题
1. 安装问题
问题:版本过旧
某些旧版本 tmux 功能受限。解决方案:
# 添加 PPA(Ubuntu)
sudo add-apt-repository ppa:pi-rho/dev
sudo apt update
sudo apt install tmux问题:编译失败
确保安装了依赖:
sudo apt install libevent-dev ncurses-dev2. 配置问题
问题:配置不生效
配置文件只在服务器启动时读取。解决方案:
# 杀死服务器重启
tmux kill-server
tmux new
# 或在运行时重新加载
:source ~/.tmux.conf3. 使用问题
问题:滚动查看历史
C-b [ 进入复制模式,然后用方向键或 PageUp/PageDown 滚动。
问题:复制到系统剪贴板
安装 xclip 并配置:
bind -T copy-mode-vi y send-keys -X copy-pipe "xclip -selection clipboard"4. 性能问题
问题:历史记录过多导致内存占用
限制历史记录:
set -g history-limit 5000十一、进阶技巧
1. 会话脚本化
启动复杂工作环境
创建脚本 ~/scripts/dev.sh:
#!/bin/bash
SESSION="dev"
# 检查会话是否已存在
tmux has-session -t $SESSION 2>/dev/null
if [ $? != 0 ]; then
# 创建新会话
tmux new-session -d -s $SESSION -n "editor"
# 创建其他窗口
tmux new-window -t $SESSION -n "shell"
tmux new-window -t $SESSION -n "logs"
tmux new-window -t $SESSION -n "monitor"
# 在 editor 窗口分割面板
tmux split-window -t $SESSION:editor -h -p 30
# 发送命令到面板
tmux send-keys -t $SESSION:editor.left "vim" C-m
tmux send-keys -t $SESSION:editor.right "ls -la" C-m
fi
# 附加到会话
tmux attach-session -t $SESSION2. 自动化运维
批量操作服务器
#!/bin/bash
SERVERS=("server1" "server2" "server3")
SESSION="ops"
tmux new-session -d -s $SESSION
for server in "${SERVERS[@]}"; do
tmux split-window -t $SESSION -h
tmux send-keys -t $SESSION "ssh $server" C-m
done
# 关闭第一个空面板
tmux kill-pane -t $SESSION:0.0
tmux select-layout -t $SESSION tiled
tmux attach -t $SESSION3. 集成其他工具
与 fzf 集成
# 模糊搜索会话
bind s run-shell "tmux list-sessions | fzf | cut -d: -f1 | xargs tmux switch-client -t"
# 模糊搜索窗口
bind w run-shell "tmux list-windows | fzf | cut -d: -f1 | xargs tmux select-window -t"十二、最佳实践
1. 命名规范
- 使用有意义的会话名:dev、test、monitor
- 使用描述性的窗口名:editor、logs、db
- 为长期工作创建专用会话
2. 工作流建议
- 为不同项目使用不同会话
- 为不同环境使用不同会话(开发、测试、生产)
- 定期清理不用的会话
3. 配置管理
- 将配置文件纳入版本控制
- 不同环境使用不同配置文件
- 使用条件语句加载不同配置
4. 安全建议
- 不要在会话中保存敏感信息
- 定期更新 tmux 版本
- 谨慎使用自动执行命令