Linux tmux 使用完全指南
概述
tmux(Terminal Multiplexer)是一款在终端环境下广泛使用的多会话管理工具。它允许用户在单个终端窗口中创建多个会话、窗口和面板,每个面板可以运行独立的程序。tmux 还支持会话分离与重连(Detach/Attach),即使网络中断或终端关闭,运行中的任务也不会中断。本文详细介绍 tmux 的核心概念、常用命令以及实用配置,帮助你提升终端操作效率。
基础语法
tmux 的核心概念分为三层:Session(会话)、Window(窗口)、Pane(面板)。一个 Session 可以包含多个 Window,每个 Window 又可以分割成多个 Pane。他们的关系是:Session > Window > Pane。默认的前缀键是 Ctrl+b,按下后松开再按其他键执行具体操作。
- Session:一组工作环境,可以包含多个窗口,常用于分离不同项目。
- Window:相当于一个终端标签页,可以切换。
- Pane:窗口内的分割区域,可以水平或垂直分割。
常用的快捷键前缀说明:Ctrl+b d 表示分离当前会话,Ctrl+b c 表示创建新窗口,Ctrl+b % 表示垂直分割,Ctrl+b " 表示水平分割。
完整代码示例+注释
以下演示 tmux 的常用操作流程,从创建会话到配置自定义:
# === 基础会话操作 ===
创建名为 myproject 的新会话
tmux new -s myproject
分离当前会话(回到普通终端)
按住 Ctrl+b,松开后再按 d
等价命令:tmux detach
列出所有会话
tmux ls
重新连接到 myproject 会话
tmux attach -t myproject
在会话内切换窗口
Ctrl+b p — 上一个窗口(previous)
Ctrl+b n — 下一个窗口(next)
Ctrl+b 0~9 — 跳转到指定编号的窗口
=== 面板(Pane)操作 ===
Ctrl+b % — 垂直分割(左边新建面板)
Ctrl+b " — 水平分割(下方新建面板)
Ctrl+b 方向键 — 切换到指定方向的面板
Ctrl+b 空格 — 切换面板布局(垂直/水平/主面板等)
调整当前面板大小
Ctrl+b Alt+方向键 (按住 Alt 再按方向键)
关闭当前面板
Ctrl+b x (会提示是否确认)
=== 复制/粘贴 ===
Ctrl+b [ — 进入复制模式
q — 退出复制模式
方向键/PageUp/PageDown — 滚动浏览
Enter — 开始选择
Enter — 复制选中文本
=== 常用命令(非快捷键) ===
创建会话并自动进入
tmux new-session -s work
重命名当前窗口
tmux rename-window api
在指定会话中执行命令(不进入交互模式)
tmux send-keys -t myproject:0 'cd /home/ubuntu' Enter
发送命令到所有面板并行执行
tmux setw synchronize-panes on
所有面板会同时收到相同的键盘输入
=== 实用的 tmux 配置示例 ===
写入 ~/.tmux.conf
set -g prefix C-a # 将前缀从 Ctrl+b 改为 Ctrl+a(更顺手)
unbind C-b
bind C-a send-prefix
set -g mouse on # 启用鼠标选择和调整面板
set -g base-index 1 # 窗口编号从 1 开始(而非 0)
set -g pane-base-index 1 # 面板编号也从 1 开始
启用鼠标拖动调整面板大小
set -g mouse-resize-pane on
颜色支持
set -g default-terminal "screen-256color"
更快的响应速度
set -g escape-time 0
显示时间格式
setw -g clock-mode-style 24
运行效果
运行 tmux 后,屏幕底部会显示一条状态栏,默认显示当前会话名、窗口编号和名称、以及时间。垂直分割(Ctrl+b %)会在当前面板左侧打开一个新的终端面板,光标自动切换到新面板;水平分割(Ctrl+b ")则将当前面板一分为二上下排列。通过方向键可以在面板之间移动焦点,长按 Alt+方向键可以调整面板边界的大小。
分离会话(Ctrl+b d)后,程序继续在后台运行,重新 attach 可以恢复到之前的完整状态。这在远程服务器上特别有用——断开 SSH 连接不会中断正在执行的构建、下载或服务进程。结合 tmuxinator 工具,还可以预先定义好完整的会话布局,一键启动多个项目的工作环境。
常见问题
Q1:tmux 中无法使用鼠标滚轮滚动历史输出
默认情况下,tmux 的面板只显示当前内容,历史输出被截断了。在 ~/.tmux.conf 中添加 set -g mouse on 可以开启鼠标支持,然后用鼠标滚轮滚动。如果希望用键盘滚动,在复制模式(Ctrl+b [)下使用 PageUp/PageDown 或 vi 风格的快捷键。
Q2:复制的内容无法粘贴到系统剪贴板
tmux 有自己的剪贴板,不与系统共享。如果需要将 tmux 中复制的内容粘贴到外部程序,需要通过 xclip 或 xsel 工具桥接。配置方式是绑定一个快捷键将 tmux 的缓冲区内容写入 xclip,例如:bind C-c run "tmux save-buffer | xclip -i -selection clipboard"。
Q3:远程连接断开后 tmux 会话还能保持吗
只要 SSH 会话创建 tmux 时是在服务器本地(而非通过 tmux attach 到另一个会话),断开连接不会影响 tmux 内部的进程。下次 SSH 登录后执行 tmux attach 即可恢复到之前的完整状态。这是 tmux 相比普通终端最重要的优势之一。
Q4:tmux 和 screen 应该如何选择
两者功能相似,但 tmux 更现代:状态栏更美观,支持更多布局选项,脚本化能力更强,且项目更活跃。screen 的优势在于部分老旧系统上预装了 screen 而没有 tmux。对于新项目,推荐使用 tmux。
延伸阅读
- tmux 官方 GitHub:https://github.com/tmux/tmux — 查看最新版本和更新日志。
- tmux 快捷键速查表:https://tmuxcheatsheet.com — 日常使用的快速参考。
- tmuxinator:使用 YAML 配置文件定义会话布局,一键启动完整的开发环境。