tmux:终端复用器的完全指南

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 的现代化替代品,功能更强大,配置更灵活,社区更活跃。

最佳实践

  1. 使用有意义的会话名称

    bash 复制代码
    tmux new -s project-name
  2. 为不同项目创建不同会话

    bash 复制代码
    tmux new -s frontend
    tmux new -s backend
  3. 使用配置文件定制环境

    • 设置更舒适的前缀键
    • 启用鼠标支持
    • 配置状态栏
  4. 利用脚本自动化

    • 创建项目启动脚本
    • 使用插件管理会话
  5. 定期清理会话

    bash 复制代码
    tmux kill-server  # 杀死所有会话

总结

tmux 是一个强大的工具,可以显著提升你的终端使用效率。虽然学习曲线可能有些陡峭,但一旦掌握,你会发现它几乎不可或缺。

核心优势

  • ✅ 会话持久化,不怕断线
  • ✅ 多任务管理,提高效率
  • ✅ 灵活配置,适应个人习惯
  • ✅ 团队协作,共享调试环境

开始使用 tmux,让你的终端工作流更加高效!


参考资源

相关推荐
其美杰布-富贵-李8 天前
深度学习中的 tmux
服务器·人工智能·深度学习·tmux
牛奶咖啡1325 天前
Linux的实用技巧——终端安全会话、命令提示工具安装使用、端口连通性测试与rm命令无法使用解决方案
linux·tmux·linux实现后台安全运行会话·linux的端口连通性测试·linux的命令提示工具·rm命令无法使用解决方法·tldr
kali-Myon1 个月前
快速解决 Docker 环境中无法打开 gdb 调试窗口以及 tmux 中无法滚动页面内容和无法选中复制的问题
运维·安全·docker·容器·gdb·pwn·tmux
迷路爸爸1803 个月前
源码编译安装最新 tmux 教程(含 Debian/Ubuntu/CentOS/Arch/macOS 等系统)
linux·ubuntu·macos·centos·debian·tmux·archlinux
Casia_Dominic6 个月前
【tmux无法使用鼠标滚轮滚动页面的问题】解决方案
linux·git·github·tmux
_Meilinger_8 个月前
碎片笔记|PromptStealer复现要点(附Docker简单实用教程)
docker·huggingface·tmux·promptstealer·hf-mirror
plmm烟酒僧10 个月前
使用 Tmux 在断开SSH连接后,保持会话的生命周期
运维·ssh·tmux·分离会话
伊织code1 年前
macOS - 使用 tmux
macos·tmux·窗格
阿正的梦工坊1 年前
tmux 中鼠标滚动异常:^[[A和^[[B是什么以及如何解决
linux·tmux