0.简介

tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具。

0.1.进程与会话

命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称”窗口”),在里面输入命令。用户与计算机的这种临时的交互,称为一次”会话”(session)

会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。

一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。

为了解决这个问题,会话与窗口可以”解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话”绑定”其他窗口。

0.2.tmux 的作用

Tmux 就是会话与窗口的”解绑”工具,将它们彻底分离。

  • 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。

  • 它可以让新窗口”接入”已经存在的会话。

  • 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。

  • 它还支持窗口任意的垂直和水平拆分。

类似的终端复用器还有 GNU Screen。Tmux 与它功能相似,但是更易用,也更强大。



1.安装

1.1.无 root 权限安装

参考这 2 篇文章

① 下载源码
需要下载三个包,分别是tmux-2.7.tar.gz,ncurses-6.1.tar.gz,libevent-2.1.8-stable.tar.gz。
下载地址如下所示:
https://github.com/tmux/tmux/releases/tag/2.7
https://invisible-mirror.net/archives/ncurses/
https://github.com/libevent/libevent/releases/tag/release-2.1.8-stable

② 生成脚本

创建脚本 $ touch tmux_install.sh
编辑脚本 $ vim tmux_install.sh
脚本内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash
# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/tmux/bin.
# It's assumed that wget and a C/C++ compiler are installed.
# exit on error
set -e
# create our directories
mkdir -p $HOME/tmux $HOME/tmux_tmp
# move source files for tmux, libevent, and ncurses to tmp dir
mv tmux-2.7.tar.gz $HOME/tmux_tmp
mv ncurses-6.1.tar.gz $HOME/tmux_tmp
mv libevent-2.1.8-stable.tar.gz $HOME/tmux_tmp
cd $HOME/tmux_tmp
# extract files, configure, and compile
############
# libevent #
############
tar xvzf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=$HOME/tmux --disable-shared
make
make install
cd ..
############
# ncurses #
############
tar xvzf ncurses-6.1.tar.gz
cd ncurses-6.1
./configure --prefix=$HOME/tmux
make
make install
cd ..
############
# tmux #
############
tar xvzf tmux-2.7.tar.gz
cd tmux-2.7
./configure CFLAGS="-I$HOME/tmux/include -I$HOME/tmux/include/ncurses" LDFLAGS="-L$HOME/tmux/lib -L$HOME/tmux/include/ncurses -L$HOME/tmux/include" CPPFLAGS="-I$HOME/tmux/include -I$HOME/tmux/include/ncurses" LDFLAGS="-static -L$HOME/tmux/include -L$HOME/tmux/include/ncurses -L$HOME/tmux/lib"
make
cp tmux $HOME/tmux/bin
cd ..
# cleanup
rm -rf $HOME/tmux_tmp

③ 运行脚本

在存放之前两步下载的源码和脚本的路径下,运行脚本 $ bash tmux_install.sh

④ 添加环境变量

回到根目录添加环境变量
$ cd ~
$ vim .bashrc
在文末添加:

1
export PATH=$PATH:$HOME/tmux/bin

$ source .bashrc

1.2.在线安装

1
2
3
4
5
6
7
8
# Ubuntu 或 Debian
$ sudo apt-get install tmux

# CentOS 或 Fedora
$ sudo yum install tmux

# Mac
$ brew install tmux



2.用法

2.0.会话、窗口、面板

按照 3 种概念区分

  • 会话 (session)
  • 窗口 (window)
  • 面板 (pane,有的也翻译成”窗格“)

一个会话可以有多个窗口,而每个窗口又可以拆分多个面板。

按照操作方式取法区分

  • 命令行
  • 快捷键

如果已经进入 tmux 环境中,可以使用 Ctrl + b 进入快捷键模式后,再按下 : 输入 tmux 的相关命令(注:此时,不再需要前面的 tmux,如 $ tmux detach 命令此时只需要键入 detach)。

2.1.会话

命令行

1
2
3
4
5
6
7
8
$ tmux new -s <session-name>  	 # 新建会话,默认从 0 开始对会话编号
$ tmux attach -t <session-name> # 接入会话,如果是编号,可以将会话名换成编号
$ tmux a -t <session-name> # (同上)接入会话的简略写法
$ tmux switch -t <session-name> # 切换会话
$ tmux detach # 分离当前会话
$ tmux kill-session -t <session-name> # 杀死会话
$ tmux rename-session -t <old-name> <new-name> # 重命名会话
$ tmux ls # 列出所有会话

快捷键(所有快捷键都需要先按下 Ctrl + b 进入快捷键模式,再按下对应的键,后面不再表述)

1
2
3
4
d: 分离当前会话
s: 列出所有会话,并可以通过方向键 + 回车键选择进入对应的会话
$: 重命名当前会话
?: 帮助(Esc/q 退出)

2.2.窗口

命令行

个人不推荐使用

快捷键

1
2
3
4
5
6
7
    c: 创建一个新窗口,状态栏会显示多个窗口的信息(窗口名称后面有 * 的,表示是该窗口处于激活状态)
p: 切换上一个窗口 (previous)
n: 切换下一个窗口 (next)
w: 列出所有会话的所有窗口,并可以通过方向键 + 回车键选择进入对应的窗口
.: 重命名窗口
&: 杀死当前窗口
数字键: 切换到指定编号的窗口

2.3.面板

命令行

个人不推荐使用

快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     	  %: 将当前面板拆分成左右 2 个
“: 将当前面板拆分成上下 2 个
方向键: 切换到其他面板
PageUp/Down: 查看历史输出(Esc/q 退出查看模式)
;: 切换到上一个面板
o: 切换到下一个面板
{: 当前面板与上一个面板交换位置
}: 当前面板与下一个面板交换位置
x: 杀死当前面板
!: 将当前面板拆分为一个独立窗口
z: 当前面板全屏显示,再次使用恢复原状
q: 显示面板编号
t: 在当前面板显示时间
Ctrl+o: 所有面板往前移动一个位置
Alt+o: 所有面板往后移动一个位置
Ctrl+方向键: 按箭头方向调整面板大小



3.其他命令

1
2
3
4
5
6
7
8
9
10
11
# 列出所有快捷键,及其对应的 Tmux 命令
$ tmux list-keys

# 列出所有 Tmux 命令及其参数
$ tmux list-commands

# 列出当前所有 Tmux 会话的信息
$ tmux info

# 重新加载当前的 Tmux 配置
$ tmux source-file ~/.tmux.conf



4.tmux 配置

参考此篇博客 — Tmux 配置:打造最适合自己的终端复用工具



参考文献

  1. 廖雪峰 Tmux 使用教程
  2. 服务器无root权限安装tmux实现终端复用和离线训练
  3. Tmux安装教程(非root用户,ubuntu)
  4. tmux 终端复用详解
  5. ssh的最佳伴侣-tmux
  6. Tmux 配置:打造最适合自己的终端复用工具