官方信息表
| 项目 | 说明 |
|---|---|
| 项目名称 | tmux |
| 一句话定位 | 终端复用器,在一个终端窗口里管理多个终端会话 |
| 代码仓库 | tmux/tmux |
| 实现语言 | C |
| 官方文档 | GitHub Wiki |
| 开源协议 | ISC |
| Star 数 | 50k+ |
| 支持平台 | Linux、macOS、BSD、Solaris |
官方配图

项目背景
tmux 是一个终端复用器(terminal multiplexer),README 开篇就说:"tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached."
简单说,tmux 让你在一个终端窗口里同时开多个终端,而且这些终端会话可以和你的 SSH 连接解耦——你断开 SSH 后,会话继续在服务器上跑,下次连上再重新 attach 回来。这是远程开发、服务器运维最常用的工具之一。
在 tmux 之前,Linux 上有个叫 GNU Screen 的老牌终端复用器。tmux 是 Screen 的现代替代品,设计更干净、脚本化更友好、支持窗口拆分和会话管理。README 也说明 tmux 可以运行在 OpenBSD、FreeBSD、NetBSD、Linux、macOS 和 Solaris 上。
对于经常用 SSH 连服务器的开发者来说,tmux 是必备工具。你可以在服务器上开一个 tmux 会话,里面跑着编译、日志、数据库操作,然后断开 SSH 去吃饭,回来再连上继续。没有 tmux 的话,SSH 一断,所有前台进程就被杀掉了。
tmux 的名字来自 "terminal multiplexer"(终端复用器),它由两部分组成:一个后台服务器进程(tmux server)和多个客户端(tmux client)。你启动 tmux 时,服务器进程就在后台跑,所有窗口和窗格都在服务器上;你 detach 后,客户端断开,服务器继续跑;你再 attach 时,相当于新客户端连到服务器上。
核心特性逐条翻译
README 列出了 tmux 的主要依赖和构建方式,核心能力可以总结为:
会话持久化(Detach/Attach)。 你可以在服务器上跑一个 tmux 会话,然后 detach 离开,SSH 断开也没关系,会话继续在后台跑。下次连上服务器再 attach 回来,所有程序都还在原地。
窗口管理(Windows)。 一个 tmux 会话里可以开多个窗口,每个窗口像一个独立的终端。按快捷键切换窗口,就像浏览器的标签页一样。
窗格拆分(Panes)。 一个窗口里可以横向或纵向拆分成多个窗格,每个窗格跑一个独立的 shell。你可以在一个屏幕上同时看日志、跑命令、编辑文件。
脚本化控制。 tmux 所有操作都可以通过命令行脚本完成,你可以写脚本自动布局窗格、启动程序,实现一键恢复工作环境。
会话共享。 多个用户可以同时 attach 到同一个 tmux 会话,互相看到对方的操作,适合 pair programming。
状态栏。 tmux 底部有一条状态栏,显示当前会话名、窗口列表、窗格信息、时间。可以自定义状态栏内容和颜色。
复制模式。 在 tmux 里可以用键盘滚动历史输出,选择并复制文本,不需要鼠标。这在远程服务器上没有图形界面时特别有用。
会话窗口窗格三层结构。 tmux 把终端分成三层:会话(session)是最顶层,一个会话可以包含多个窗口(window),每个窗口又可以拆成多个窗格(pane)。这种层级结构让你可以同时管理多个项目,每个项目一个会话,会话里多个窗口对应不同任务。
脚本化控制。 所有 tmux 操作都可以通过命令行完成,你可以写 shell 脚本一键创建工作环境:新建会话、拆窗格、每个窗格跑不同程序。这在服务器上部署开发环境时特别有用。比如你可以开一个叫 "work" 的会话,里面有 3 个窗口:一个跑代码编辑器,一个跑服务,一个看日志。再开一个叫 "home" 的会话,浏览网页、写笔记。切换会话就像换桌面。
tmux 是用 C 语言写的,非常轻量,内存占用只有几 MB。它的设计哲学是"做一件事并做好":只做终端复用,不做花里胡哨的 UI。
在远程开发场景下,tmux 的价值怎么强调都不为过。假设你在服务器上编译一个大型项目,编译需要 30 分钟。没有 tmux 的话,你必须保持 SSH 连接不断,一旦网络抖动断开,编译就前功尽弃。用 tmux 的话,编译在后台跑,你随时可以 detach、去喝杯咖啡、回家、第二天再 attach 回来继续看进度。
tmux 的设计非常简单:一个后台服务器进程管所有会话,多个客户端连上去看。你 detach 只是客户端断开,服务器还在跑。这种 C/S 架构让多人共享会话成为可能——你和同事同时 attach 到同一个 tmux 会话,就能实时看到对方在做什么。
环境要求
README 列出了 tmux 的编译依赖:
- libevent 2.x:github.com/libevent/libevent
- ncurses:invisible-mirror.net/archives/ncurses
- C 编译器(gcc 或 clang)、make、pkg-config、yacc/bison
这些依赖在大多数 Linux 发行版的开发包里都有,直接 sudo apt build-dep tmux 就能装齐。
部署步骤
方式一:用包管理器安装(推荐)
大多数 Linux 发行版和 macOS 都有 tmux 包:
# Debian/Ubuntu
sudo apt install tmux
# Fedora
sudo dnf install tmux
# macOS
brew install tmux
包管理器安装的版本通常是稳定版,适合日常使用。如果你需要最新特性,可以从源码编译。
方式二:从源码编译
README 给出了从 release tarball 编译的步骤:
./configure && make
sudo make install
从 git 克隆最新代码还需要 autoconf 和 automake:
git clone https://github.com/tmux/tmux.git
cd tmux
sh autogen.sh
./configure && make
sudo make install
README 还提到,如果系统装了 utempter 库,可以用 --enable-utempter 参数启用,让 tmux 自动更新 utmp 记录。
方式三:使用 Docker
不想在本地装 tmux,可以在容器里跑:
docker run -it --rm tmux
但 tmux 本身是个轻量工具,直接装在本地更方便。
使用方法
启动一个新的 tmux 会话:
tmux new -s work
在 tmux 里,所有快捷键都以前缀键 Ctrl+b 开头:
Ctrl+b c:新建窗口Ctrl+b n:切到下一个窗口Ctrl+b p:切到上一个窗口Ctrl+b 0-9:按编号切窗口Ctrl+b %:横向拆分窗格Ctrl+b ":纵向拆分窗格Ctrl+b 方向键:在窗格间切换Ctrl+b d:detach(离开会话,后台继续跑)Ctrl+b [:进入复制模式(可以用方向键滚动,按 q 退出)
Detach 后列出所有会话:
tmux ls
重新 attach 到某个会话:
tmux attach -t work
如果只有一个会话,直接 tmux attach 就行。
杀死某个会话:
tmux kill-session -t work
杀死所有会话:
tmux kill-server
重命名当前会话:
tmux rename-session -t 旧名 新名
在不进入 tmux 的情况下执行命令:
tmux new-session -d -s work 'python app.py'
把当前窗格最大化再还原:
Ctrl+b z
切换上一个窗格:
Ctrl+b ;
关闭当前窗格:
Ctrl+b x
调整窗格大小:
Ctrl+b 方向键(按住 Ctrl+b 不放,按方向键调整)
把当前窗格移到新窗口:
Ctrl+b !
列出所有会话、窗口、窗格:
Ctrl+b s
重命名当前窗口:
Ctrl+b ,
新建窗口并指定名字:
tmux new-window -n logs
在指定窗格执行命令:
tmux send-keys -t work.0 'tail -f /var/log/syslog' Enter
README 提到有一个示例配置文件 example_tmux.conf,可以参考它写自己的 ~/.tmux.conf,自定义前缀键、状态栏、颜色等。
常见问题(FAQ)
问:tmux 和 Screen 有什么区别? tmux 是 Screen 的现代替代品,设计更干净、脚本化更友好、支持窗格拆分。Screen 已经多年没大更新,新项目基本都用 tmux。
问:SSH 断开后 tmux 里的程序会被杀掉吗? 不会。tmux 会话是和 SSH 连接解耦的,只要服务器不重启,会话就一直在。
问:怎么在 tmux 里复制粘贴? 按 Ctrl+b [ 进入复制模式,用空格开始选择,回车复制。按 Ctrl+b ] 粘贴。
问:tmux 配置文件在哪里? ~/.tmux.conf,每次启动 tmux 时自动加载。
问:可以把 tmux 会话共享给别人看吗? 可以。对方用 tmux attach -t 会话名 就能 attach 到你的会话,和你看到同一个画面。
问:tmux 支持鼠标吗? 支持,在配置里加 set -g mouse on 就可以用鼠标选窗格、滚屏、调大小。
问:tmux 怎么复制粘贴到本地? 在 tmux 复制模式里选中文本后,需要配置 set -g copy-command 或者用鼠标选中复制,才能把内容传送到系统剪贴板。Linux 上通常装 xclip 或 xsel 后才能跨 tmux 复制。
问:tmux 会话会自动保存吗? 默认不会。服务器重启后 tmux 会话就没了。如果需要持久化,可以用 tmux 插件比如 resurrect,把会话布局保存到磁盘。
问:tmux 里怎么查看快捷键? 按 Ctrl+b ? 可以列出所有快捷键。README 也提到完整文档在 tmux 的 manpage 里,运行 man tmux 查看。
问:tmux 配置文件可以多机同步吗? 可以。把 ~/.tmux.conf 放到 Git 仓库或 dotfiles 管理工具里,换电脑时直接 clone 下来就能用。
问:tmux 可以在 Windows 上用吗? 原生不支持,但 Windows 10 之后有 WSL,可以在 WSL 里用 tmux。Windows 上也有第三方移植版,但不如原生 Linux/macOS 体验好。
问:tmux 和 iTerm2 的分屏有什么区别? iTerm2 的分屏是图形终端的功能,断开 SSH 就没了。tmux 的分屏是在服务器上的,断开 SSH 会话还在,重新连上就能继续。
问:tmux 里怎么改前缀键? 在 ~/.tmux.conf 里加 set -g prefix C-a,把前缀键从 Ctrl+b 改成 Ctrl+a。很多 Vim 用户喜欢改成 Ctrl+a,因为离手掌更近。
问:tmux 怎么调状态栏? 在配置里用 set -g status-right 自定义右侧显示内容,比如时间、电池、网络。可以用 #[fg=colour] 标签设置颜色。
问:tmux 里怎么翻页? 按 Ctrl+b [ 进入复制模式,然后用 PageUp/PageDown 或方向键翻页,按 q 退出。
问:tmux 怎么自定义状态栏颜色? 在配置里用 set -g status-style bg=black,fg=white 设置状态栏背景和前景色,用 set -g status-left-style 和 set -g status-right-style 分别设置左右两侧样式。
问:tmux 怎么把窗格平均分配? 默认就是平均分配。如果手动调过大小,用 Ctrl+b 空格 可以在不同布局间切换,包括平均布局、横向布局、纵向布局。
问:tmux 怎么锁定会话? 用 tmux lock-session 可以锁定整个会话,需要输入密码才能继续操作。适合离开电脑时保护会话内容。
问:tmux 怎么调整窗格大小? 用 Ctrl+b :resize-pane -D 10 向下扩展 10 行,或者用 Ctrl+b 加方向键手动调整。
问:tmux 怎么在两个窗格间同步输入? 用 :setw synchronize-panes on 让所有窗格同时接收键盘输入,适合同时在多个服务器上执行相同命令。
问:tmux 怎么重命名当前窗口? 按 Ctrl+b , 进入重命名模式,输入新名字回车。
问:tmux 怎么复制粘贴? 按 Ctrl+b [ 进入复制模式,用空格开始选择,回车复制,按 Ctrl+b ] 粘贴。
问:tmux 怎么切换窗口? 按 Ctrl+b n 下一个窗口,Ctrl+b p 上一个窗口,Ctrl+b 0-9 按编号切换。
问:tmux 怎么新建窗口? 按 Ctrl+b c 新建窗口,或者用 tmux new-window 命令。
问:tmux 怎么关闭窗口? 按 Ctrl+b & 关闭当前窗口,或者用 tmux kill-window 命令。
问:tmux 怎么拆分窗格? 按 Ctrl+b % 横向拆分,Ctrl+b " 纵向拆分。
问:tmux 怎么切换窗格? 按 Ctrl+b 方向键 在窗格间切换,或者按 Ctrl+b o 循环切换。
问:tmux 怎么关闭窗格? 按 Ctrl+b x 关闭当前窗格,或者直接输入 exit 命令。
问:tmux 怎么 detach? 按 Ctrl+b d 离开会话,后台继续运行。
问:tmux 怎么 attach 回来? 用 tmux attach -t 会话名 重新连接到会话。
问:tmux 怎么列出所有会话? 用 tmux ls 列出所有运行中的会话。
问:tmux 怎么杀死会话? 用 tmux kill-session -t 会话名 终止指定会话。
问:tmux 怎么重命名会话? 用 tmux rename-session -t 旧名 新名 重命名会话。
问:tmux 怎么在指定窗格执行命令? 用 tmux send-keys -t work.0 'tail -f /var/log/syslog' Enter 在指定窗格执行命令。
问:tmux 怎么新建窗口? 用 tmux new-window -n logs 新建窗口并指定名字。
问:tmux 怎么切换窗口? 按 Ctrl+b n 下一个窗口,Ctrl+b p 上一个窗口,Ctrl+b 0-9 按编号切换。
问:tmux 怎么关闭窗格? 按 Ctrl+b x 关闭当前窗格,或者直接输入 exit 命令。
问:tmux 怎么在指定窗格执行命令? 用 tmux send-keys -t work.0 'tail -f /var/log/syslog' Enter 在指定窗格执行命令。
问:tmux 怎么列出所有会话? 用 tmux ls 列出所有运行中的会话。
问:tmux 怎么 detach? 按 Ctrl+b d 离开会话,后台继续运行。
问:tmux 怎么重命名会话? 用 tmux rename-session -t 旧名 新名 重命名会话。
问:tmux 怎么拆分窗格? 按 Ctrl+b % 横向拆分,Ctrl+b " 纵向拆分。
问:tmux 怎么新建窗口? 用 tmux new-window -n logs 新建窗口并指定名字。
问:tmux 怎么关闭窗格? 按 Ctrl+b x 关闭当前窗格,或者直接输入 exit 命令。
问:tmux 怎么 attach 回来? 用 tmux attach -t 会话名 重新连接到会话。
问:tmux 怎么杀死会话? 用 tmux kill-session -t 会话名 终止指定会话。
问:tmux 怎么列出所有会话? 用 tmux ls 列出所有运行中的会话。
问:tmux 怎么重命名会话? 用 tmux rename-session -t 旧名 新名 重命名会话。
问:tmux 怎么新建窗口? 用 tmux new-window -n logs 新建窗口并指定名字。
问:tmux 怎么切换窗口? 按 Ctrl+b n 下一个窗口,Ctrl+b p 上一个窗口,Ctrl+b 0-9 按编号切换。
问:tmux 怎么关闭窗口? 按 Ctrl+b & 关闭当前窗口,或者用 tmux kill-window 命令。
问:tmux 怎么拆分窗格? 按 Ctrl+b % 横向拆分,Ctrl+b " 纵向拆分。
问:tmux 怎么关闭窗格? 按 Ctrl+b x 关闭当前窗格,或者直接输入 exit 命令。
问:tmux 怎么 attach 回来? 用 tmux attach -t 会话名 重新连接到会话。
跳转链接
- 官方代码仓库:tmux/tmux
- 官方 Wiki:github.com/tmux/tmux/wiki
- FAQ:wiki/FAQ
- 邮件列表:tmux-users@googlegroups.com
- 依赖 libevent:libevent/releases
- 依赖 ncurses:ncurses 下载
- bash 补全:tmux completion