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 tmux

macOS

brew install tmux

CentOS/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 --> H

mermaid

3. 术语汇总表

术语描述
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 top

2. 状态行说明

当 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 | more

5. 附加和分离

分离会话

按 C-b d 分离会话,返回 shell,tmux 会话和程序继续在后台运行。

重新附加

# 附加到最近使用的会话
tmux attach

# 附加到指定会话
tmux attach -t mysession

# 附加并分离其他客户端
tmux attach -dt mysession

智能附加

# 会话存在则附加,不存在则创建
tmux new -As mysession

6. 列出会话

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 top

2. 分割窗口(创建面板)

水平分割

C-b % 将当前面板水平分割为左右两个面板。

垂直分割

C-b " 将当前面板垂直分割为上下两个面板。

命令选项

# -h 水平分割,-v 垂直分割
:split-window -h

# -d 不改变活动面板
:split-window -d

# -f 新面板跨整个窗口宽度或高度
:split-window -f

# -b 将新面板放在左侧或上方
:split-window -b

3. 切换窗口

快捷键功能
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]

mermaid

六、高级功能

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_buffer

4. 查找功能

C-b f 提示输入文本,然后进入树模式,仅显示包含该文本的面板。

5. 鼠标支持

启用鼠标

:set -g mouse on

鼠标操作

  • 左键点击面板:切换活动面板
  • 左键点击状态栏窗口名:切换当前窗口
  • 拖动面板边框:调整面板大小
  • 在面板内拖动:选择文本
  • 右键点击:打开命令菜单

七、配置 tmux

1. 配置文件

文件位置

~/.tmux.conf

重要说明

配置文件仅在 tmux 服务器启动时执行,而非创建新会话时。

重新加载配置

:source ~/.tmux.conf

2. 配置文件语法

基本规则

  • 每行一个命令
  • 以 # 开头的行是注释
  • 支持引号和转义

示例配置

# 这是注释
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-prefix

4. 常用配置示例

# 基本设置
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。

操作步骤

  1. ssh 连接到远程服务器
  2. 启动 tmux:tmux new -s dev
  3. 第一个窗口运行编辑器:vim main.c
  4. C-b c 创建新窗口运行编译器
  5. C-b " 垂直分割,上半部分运行测试
  6. C-b d 分离会话,下班回家
  7. 从家里重新连接:ssh server && tmux attach -t dev

效果

  • 工作状态完全保留
  • 不受网络断线影响
  • 多处无缝切换

2. 监控多台服务器

场景描述

同时监控多台服务器的系统状态。

操作步骤

  1. 创建 tmux 会话:tmux new -s monitor
  2. C-b % 垂直分割为多个面板
  3. 在每个面板中 ssh 到不同服务器
  4. 每个面板运行 top 或 htop
  5. 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-dev

2. 配置问题

问题:配置不生效

配置文件只在服务器启动时读取。解决方案:

# 杀死服务器重启
tmux kill-server
tmux new

# 或在运行时重新加载
:source ~/.tmux.conf

3. 使用问题

问题:滚动查看历史

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 $SESSION

2. 自动化运维

批量操作服务器

#!/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 $SESSION

3. 集成其他工具

与 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 版本
  • 谨慎使用自动执行命令

十三、参考资料


参考资料

  1. tmux GitHub Repository
  2. tmux Getting Started Guide
  3. OpenBSD tmux Manual
  4. tmux FAQ
最后修改:2026 年 01 月 19 日
如果觉得我的文章对你有用,请随意赞赏