tmux:终端复用器的完全指南
什么是 tmux?
tmux(Terminal Multiplexer,终端复用器)是一个强大的命令行工具,允许你在单个终端窗口中管理多个会话、窗口和面板。它最初由 Nicholas Marriott 开发,现已成为开发者和系统管理员必备的工具之一。
为什么需要 tmux?
想象一下这些场景:
- 🔌 SSH 连接断开:你正在远程服务器上运行一个长时间的任务,突然网络中断,你的工作全部丢失
- 📊 多任务管理:你需要同时查看日志、编辑代码、运行测试,但不想打开多个终端窗口
- 👥 团队协作:多个开发者需要同时查看和调试同一个会话
- 💻 工作流恢复:每天都要重新打开多个终端窗口,配置环境,启动服务
tmux 完美解决了这些问题。
核心概念
在深入使用之前,理解 tmux 的三个核心概念很重要:
1. Session(会话)
会话是 tmux 的最高层级。一个会话可以包含多个窗口,即使你断开连接,会话也会在后台继续运行。
2. Window(窗口)
窗口类似于浏览器标签页,一个会话可以有多个窗口。每个窗口占据整个终端屏幕。
3. Pane(面板)
面板是窗口内的分割区域。你可以在一个窗口中创建多个面板,同时显示不同的内容。
Session
└── Window 1
├── Pane 1 (终端)
└── Pane 2 (编辑器)
└── Window 2
└── Pane 1 (日志查看)
安装 tmux
macOS
bash
brew install tmux
Linux (Ubuntu/Debian)
bash
sudo apt-get install tmux
Linux (CentOS/RHEL)
bash
sudo yum install tmux
验证安装
bash
tmux -V
基本使用
创建和连接会话
bash
# 创建新会话(默认名称)
tmux
# 创建命名会话
tmux new -s myproject
# 创建后台会话并执行命令
tmux new-session -d -s dev 'npm run dev'
# 列出所有会话
tmux ls
# 或
tmux list-sessions
# 连接到会话
tmux attach -t myproject
# 或简写
tmux a -t myproject
# 杀死会话
tmux kill-session -t myproject
# 杀死所有会话
tmux kill-server
默认快捷键前缀
tmux 的所有快捷键都需要先按前缀键 (默认是 Ctrl+b),然后释放,再按其他键。
重要提示 :先按 Ctrl+b,释放,再按其他键。不要同时按住!
常用快捷键
会话管理
| 快捷键 | 功能 |
|---|---|
Ctrl+b d |
分离会话(detach),会话继续在后台运行 |
Ctrl+b s |
列出所有会话,可以切换 |
Ctrl+b $ |
重命名当前会话 |
窗口管理
| 快捷键 | 功能 |
|---|---|
Ctrl+b c |
创建新窗口 |
Ctrl+b , |
重命名当前窗口 |
Ctrl+b w |
列出所有窗口,可以切换 |
Ctrl+b n |
切换到下一个窗口 |
Ctrl+b p |
切换到上一个窗口 |
Ctrl+b 0-9 |
切换到指定编号的窗口 |
Ctrl+b & |
关闭当前窗口 |
面板管理
| 快捷键 | 功能 |
|---|---|
Ctrl+b % |
垂直分割面板(创建左右两个面板) |
Ctrl+b " |
水平分割面板(创建上下两个面板) |
Ctrl+b 方向键 |
在面板间切换 |
Ctrl+b x |
关闭当前面板 |
Ctrl+b z |
最大化/恢复当前面板(全屏切换) |
Ctrl+b { |
与上一个面板交换位置 |
Ctrl+b } |
与下一个面板交换位置 |
Ctrl+b Ctrl+方向键 |
调整面板大小 |
Ctrl+b Space |
切换面板布局 |
复制模式
tmux 有自己的复制模式,类似于 vi 编辑器:
| 快捷键 | 功能 |
|---|---|
Ctrl+b [ |
进入复制模式 |
Space |
开始选择文本 |
Enter |
复制选中的文本 |
Ctrl+b ] |
粘贴 |
实际应用场景
场景 1:开发服务器管理
bash
# 创建后台会话运行开发服务器
tmux new-session -d -s dev 'npm run dev'
# 查看日志
tmux attach -t dev
# 分离会话(服务器继续运行)
# 按 Ctrl+b d
# 稍后重新连接查看日志
tmux attach -t dev
场景 2:多任务开发环境
bash
# 创建开发会话
tmux new -s coding
# 在 tmux 内:
# Ctrl+b % - 垂直分割
# Ctrl+b " - 水平分割
# 现在你有 4 个面板:
# - 左上:代码编辑器
# - 右上:终端命令
# - 左下:日志查看
# - 右下:测试运行
场景 3:远程服务器工作
bash
# SSH 连接到服务器
ssh user@server
# 创建 tmux 会话
tmux new -s work
# 运行长时间任务
./long-running-script.sh
# 即使 SSH 断开,任务继续运行
# 重新连接后:
tmux attach -t work
# 任务仍在运行!
场景 4:团队协作调试
bash
# 开发者 A 创建共享会话
tmux new -s debug
# 开发者 B 连接到同一会话(需要配置)
tmux attach -t debug
# 两人可以同时看到相同的终端输出
配置文件:~/.tmux.conf
tmux 可以通过配置文件 ~/.tmux.conf 进行高度定制。
基础配置示例
bash
# 设置前缀键为 Ctrl+a(比 Ctrl+b 更方便)
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix
# 启用鼠标支持(方便点击切换面板)
set -g mouse on
# 设置窗口和面板索引从 1 开始
set -g base-index 1
setw -g pane-base-index 1
# 设置快捷键重新加载配置
bind r source-file ~/.tmux.conf \; display "Config reloaded!"
# 分割面板的快捷键(更直观)
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %
# 使用 vi 键位进行面板切换
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# 使用 vi 键位进行窗口切换
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+
# 设置复制模式为 vi 模式
setw -g mode-keys vi
# vi 模式下的复制粘贴
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# 状态栏配置
set -g status-bg black
set -g status-fg white
set -g status-left-length 40
set -g status-left "#[fg=green]Session: #S #[fg=yellow]Window: #I #[fg=cyan]Pane: #P"
set -g status-right "#[fg=cyan]%d %b %R"
set -g status-interval 60
set -g status-justify centre
# 窗口活动通知
setw -g monitor-activity on
set -g visual-activity on
# 增加历史缓冲区大小
set -g history-limit 10000
应用配置:
bash
tmux source-file ~/.tmux.conf
高级技巧
1. 脚本化会话创建
创建脚本 setup-dev.sh:
bash
#!/bin/bash
# 创建开发环境会话
tmux new-session -d -s dev
# 窗口 1: 编辑器
tmux rename-window -t dev:1 'editor'
tmux send-keys -t dev:1 'vim' C-m
# 窗口 2: 服务器
tmux new-window -t dev:2 -n 'server'
tmux send-keys -t dev:2 'npm run dev' C-m
# 窗口 3: 测试
tmux new-window -t dev:3 -n 'test'
tmux send-keys -t dev:3 'npm test' C-m
# 窗口 4: 日志
tmux new-window -t dev:4 -n 'logs'
tmux send-keys -t dev:4 'tail -f logs/app.log' C-m
# 切换到第一个窗口
tmux select-window -t dev:1
# 连接到会话
tmux attach -t dev
使用:
bash
chmod +x setup-dev.sh
./setup-dev.sh
2. 会话恢复插件
安装 tmux-resurrect 插件可以保存和恢复会话状态:
bash
# 安装 TPM (Tmux Plugin Manager)
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# 在 ~/.tmux.conf 中添加:
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
# 在 tmux 内按 Ctrl+b I 安装插件
快捷键:
Ctrl+b Ctrl+s- 保存会话Ctrl+b Ctrl+r- 恢复会话
3. 自动启动脚本
在 ~/.zshrc 或 ~/.bashrc 中添加:
bash
# 如果不在 tmux 中,自动启动 tmux
if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then
tmux attach -t default || tmux new -s default
fi
4. 条件执行命令
bash
# 只在 tmux 中执行
if [ -n "$TMUX" ]; then
echo "当前在 tmux 会话中"
fi
常见问题
Q: 如何退出 tmux?
A: 在 tmux 内输入 exit 或按 Ctrl+d。如果只是暂时离开,按 Ctrl+b d 分离会话。
Q: 如何杀死无响应的面板?
A: 按 Ctrl+b x,然后确认。
Q: 如何滚动查看历史输出?
A: 按 Ctrl+b [ 进入复制模式,然后使用方向键或 Page Up/Page Down 滚动。
Q: 如何同步输入到所有面板?
A: 按 Ctrl+b : 进入命令模式,输入 setw synchronize-panes,再次输入取消同步。
Q: tmux 和 screen 有什么区别?
A: tmux 是 screen 的现代化替代品,功能更强大,配置更灵活,社区更活跃。
最佳实践
-
使用有意义的会话名称
bashtmux new -s project-name -
为不同项目创建不同会话
bashtmux new -s frontend tmux new -s backend -
使用配置文件定制环境
- 设置更舒适的前缀键
- 启用鼠标支持
- 配置状态栏
-
利用脚本自动化
- 创建项目启动脚本
- 使用插件管理会话
-
定期清理会话
bashtmux kill-server # 杀死所有会话
总结
tmux 是一个强大的工具,可以显著提升你的终端使用效率。虽然学习曲线可能有些陡峭,但一旦掌握,你会发现它几乎不可或缺。
核心优势:
- ✅ 会话持久化,不怕断线
- ✅ 多任务管理,提高效率
- ✅ 灵活配置,适应个人习惯
- ✅ 团队协作,共享调试环境
开始使用 tmux,让你的终端工作流更加高效!
参考资源: