tmux 简明教程
对于绝对的新手来说,tmux 是一个基本上在终端内运行终端的 CLI(命令行界面)程序,这些假终端由 termux 保持活跃,即使我们断开 ssh 连接。
我想我是在写给过去的自己,教育过去的自己,而过去的自己是一个最愚蠢的 GUI(图形用户界面)爱好者,我对他非常生气,因为他对 GUI 的痴迷。我的意思是,不要误解我,GUI 有它的位置,因为它们直观,但并不是在所有地方都适用。当你使用一个只有 512MB 内存的垃圾 Raspberry Pi 时,你会知道这一点。
1、旅程是如何开始的?
好吧,我会告诉你我是如何在数字生活中第一次发现 tmux 的。我在 Linux 中尝试使用 KVM QEMU 虚拟化,并陷入了所谓的“发行版跳跃”(Distro-Hopping)的灰色低效区域,我尝试了很多 Linux 发行版只是为了尝试。
从经验来看,DistroHopping 是一种绝对悲伤、痛苦、令人沮丧且无成效的爱好。你是为了工作机器,而不是让机器为你工作,不管你的最爱的 Linux YouTuber 告诉你什么。
注意: 如果想真正享受这个爱好,你需要有一个本地存储这些大型 OS 镜像的仓库(比如本地 NAS),并仅使用 SSD 进行 OS 安装。不要做任何旋转磁盘 HDD 的事情,这会打你的脸并浪费你的时间。这就是现实。
所以,无论如何,我(过去的我)正在从他们的网站下载 Linux Mint ISO,并且由于我(过去的我)是个 GUI 爱好者,他通常这样做:
去他们的网站,在浏览器中点击“下载”按钮并获取 ISO。这是完全正常和理智的人做的事情。
1.1 愚蠢的冒险
他做了吗?他去了发行版的网站并像一个理智的人一样获取了 ISO?!!哦,不,他没有。他正通过 Android 平板 SSH 连接到他的 Linux 电脑,他(我过去的头脑)遇到了以下问题。
- 我应该去另一个房间(服务器所在的地方),连接键盘、鼠标和显示器到盒子上并获取 ISO 吗??
- 在 Android 平板上下载这个巨大的血吸虫(更像带宽吸虫)ISO,然后通过 SAMBA 或 SFTP 将 ISO 传输到服务器。——哇,我对这个人真是佩服得五体投地。
他体重 220 磅,近 100 公斤,(是的,这是一个相当大的家伙),所以无论他多么有动力,第一个选项都不太可能。所以他慢慢倾向于第二个方法,即进行两次文件传输,一次从互联网到 Android 平板,另一次从 Android 平板到他的服务器。
他知道移动浏览器的行为很阴险且烦人,尤其是在处理大文件下载时,有时文件确实会下载,有时它会说已经下载完成,但检查属性时却显示 0 字节。是的,这比你想象的更常发生。
1.2 他后来做了什么?
那天他感觉很时尚,想要证明自己的 CLI(命令行界面)技能,他用了 wget。是的,就是 wget,你在 URL 旁边放 wget,它就会下载该 URL 所属的文件。

使用 wget 紧随其后的是来自发行版网站的 iso 链接
2、计算机之神的惩罚
就在下载完成 40% 时,出乎意料地,这个极其可靠的 SSH 连接(是的,SSH 实际上非常可靠,只需要 56Kbps 的带宽就可以工作)从平板电脑到服务器断开了,重新连接后,我(他)意识到下载失败,已完成的文件根本不存在。
现在,他脑海中的问题是:
— 为什么连接会失败,即使连接失败(它不应该失败),为什么不能像浏览器下载那样,即使最小化。
事实是 wget 可以通过 -b 和 -c 选项允许后台下载和重试,但这个傻瓜不知道。或者你可以使用 nohup。见下文用法:
wget -bc http://file_link.iso
2.1 实际发生了什么
我(他)注意到,SSH 连接断开是因为这个荒谬的 Android 平板切换了 SSID,从 2.4GHz 频段切换到另一个保存的 5GHz 频段。谁让它这么做的?……显然没人……这就是导致连接断开的原因,因此下载失败/损坏。
计算机之神确实从他们的科技奥林匹斯山中惩罚了他。
3、TMUX 救命来了
对于绝对的新手来说,tmux 是一个基本上在终端内运行终端的 CLI(命令行界面)程序,这些假终端由 termux 保持活跃,即使我们断开 ssh 连接。
通常,您计算机操作系统中的原始终端程序的链式反应通常是这样的:
你 — — — — → 终端 — — — — — → Shell — -— — — —-> Kernel
但有了 tmux,它位于你和实际终端程序之间
你 — — — → tmux — — — — → 终端 — — — ->Shell — — — — →Kernel
把它想象成“在一个 GUI 操作系统中使用多个窗口与鼠标和键盘进行多任务处理,只是你不在 GUI 中而是 CLI。
我们在客户端设备(在我的情况下,是 Android)上不安装任何东西。它在 Linux 机器上运行。所以我们称它为服务器程序。在这种情况下,让我们称之为 tmux 服务器。
通常,许多发行版默认不安装它,我们需要手动安装如下:
sudo apt install tmux
以上命令适用于基于 Debian 的发行版,如 Ubuntu、LinuxMint 等。
4、好吧,我安装了它。接下来呢,我该如何操作:
好的,让我们尝试理解术语并逐层揭开它。
- tmux 服务器或 tmux 本身基于“会话”(sessions)的概念。
- 会话通常由“窗口”(windows)组成。
- 窗口通常由“窗格”(panes)组成。
明白了吗,不…你没懂。好吧,让我们纠正一下。
5、类比
看看下面的截图:

一个桌面/工作区中的 3 个窗口。
在上面的图片中,你可以看到有 3 个带有红色边框的 firefox 窗口。1 个占据屏幕的 50%,其余两个各占 25%。这 3 个窗口构成了一个称为“桌面/虚拟桌面/工作区”的单位。
现在我们通过 Alt+Tab 切换这些三个窗口。这是在许多操作系统中 GUI 的做法。
现在假设我们想使用另一个应用程序整齐地排列,但我们不想丢失我们已经创建的 firefox 窗口。我们怎么做?只需启动另一个虚拟桌面/工作区,如下所示。

另一个桌面/工作区中的 2 个窗口
现在在上面的截图中,你可以看到“绘图程序”和“文件管理器程序”各自占据一半的空间,但之前的 firefox 工作区并没有消失。它存在于另一个工作区/虚拟桌面中。你根据你的操作系统通过键盘快捷键在这些工作区之间导航。
这就是理解 tmux 所需的精确心理模型。
好了,在开始之前,几件事:
- tmux 是一个 cli 工具,所以我们不需要鼠标
- 理解键盘快捷键和按键。特别是进入模式时。
5.1 如何阅读此键盘快捷键指南:

好的,在上面的 tmux 键盘快捷键(常用快捷键)中,你通过按“Ctrl + B”首先进入 tmux 的 监听模式,然后 释放键盘,然后通过按下键盘上的 % 键 来询问你想做什么。
不要同时按 Ctrl 键、B 键和 % 键。
5.2 另一个类比,想象你有一个智能音箱,如 Echo/Alexa,
- 你首先用它的唤醒词来让它倾听你的命令。在这个例子中是“Alexa”
- 然后,问它你想让它做什么,“设置 3 分钟的计时器”。
你不会说“Alexa, Alexa, 设置 3 分钟的计时器”,尽管它可能有效,鉴于它的聪明。重点是它是多余的。
对吧,现在让我们跳入:

一个简单的终端窗口,随你的操作系统一起提供。tmux 还未启动。
好了,让我们启动它。
tmux
你只需在命令行中运行 tmux,然后就会发生以下情况

下面的绿色状态栏表明 Tmux 已启动。注意其中的星号,它告诉你你处于第 0 个窗口(是的,这里的计数从 0 开始)。单词“bash”表示你还没有命名窗口(并且它在你的操作系统中使用 bash shell),可以根据需要配置它,以适应你正在进行的工作。稍后会详细介绍。
6、创建更多窗口
观察下面的截图,同时注意按键序列:
它的顺序是:按 Ctrl + B 进入“监听模式”,然后松开两者,再按 C 键。这会在 tmux 中创建新窗口。在下面的截图中,你可以看到 5 个窗口 通过组合键创建。

创建了 6 个窗口。每个窗口通过 Ctrl + B 然后 C 键创建。绿色状态栏开头的 [0] 仅仅告诉你 会话的名称。因为我们没有命名,它给自己命名为 0。
6.1 导航窗口
由于我们在上面创建了另外 5 个窗口,你可以通过按 Ctrl + B 然后 N 键 导航到下一个窗口,或 P 键 导航到上一个窗口。
或者,你也可以通过输入其窗口编号进入一个窗口。当然,你必须通过按 Ctrl + B 进入监听模式。序列如下:Ctrl + B 和窗口编号
星号符号 * 会告诉你当前所在的窗口。
7、会话的概念:将其牢记于心
会话类似于工作区的概念。你为解决某个问题或设置环境而启动每个会话。例如,假设你在 Window-1 中运行 wget 并使用它下载一个大文件,在 Window-2 中你玩“cmatrix”屏幕保护程序。这些窗口组成了一个会话。它们是永久性的,直到你终止它们或服务器重启。这是理解和使用 tmux 的核心。即使你的 SSH 连接断开,这些 会话 会继续在后台执行这些大任务。
是的,这意味着你可以通过客户端的 SSH 启动一个 tmux 会话,要求它下载一个大文件,一旦下载开始,你就可以关闭它,让 tmux 保持 wget 运行。
当你再次通过 SSH 连接到服务器时,你可以继续你离开的地方,仿佛什么都没发生过。
7.1 关闭会话中的窗口
有时你可能会意外创建了更多的窗口,想要关闭它们,因为你是一个整洁狂,想要更好地控制或组织现有的会话。我们怎么做到这一点:
只需在窗口中输入 “exit”,它就会关闭带有 * 星号的窗口。试试看,然后回来。
exit
7.2 重命名会话
还记得绿色状态栏开头的 [0] 吗?那告诉了会话的名称。比如说,如果你想根据你的需求重命名它。我们怎么做到这一点?
有两种方式:
- 使用监听模式,即 Ctrl + B 然后 $ 键:它会提示你重命名。
- 在会话中使用命令:
tmux rename-session alpha
# 这将把当前会话从 [0] 重命名为 alpha
8、附加和分离会话:tmux 的核心
正如前面所提到的,tmux 依赖于一个叫做“会话”的概念。记得我们上面创建的 5 个窗口,它们属于一个名为/named [0] 的会话。
既然如此,我们如何创建一个新的会话以及如何跟踪和管理现有的会话?这就是我们今天要讨论的内容。
8.1 创建新会话
默认情况下,当你进入 tmux 时,它会创建一个名为 [0] 的新会话,但如果你希望启动一个特定名称的会话:
tmux new-session -s Alpha
这会创建一个名为 Alpha 的会话。当前窗口为 0*,如下所示。

想法:基本上你可以使用 Alpha 会话来完成 X 任务,使用 Y 个窗口,并随时退出(分离)它,同时它在后台运行。
8.2 从会话中分离
假设你现在在 Alpha 会话中,想创建一个名为 Beta 的新会话。你怎么做??
退出 Alpha,不要使用 exit 命令,因为它会终止 Alpha 会话。相反,使用命令 $ tmux detach 当你在 Alpha 会话中时。

正确分离后,你的终端会清楚地表明它已从会话中分离,并附带会话名称。
现在,让我们创建新的会话:
如前所述,可以通过以下方式创建一个具有特定名称的新会话。
tmux new-session -s Beta
# 我们刚刚创建了一个名为 Beta 的新会话。
# Tmux 将我们带入 Beta,当前活动窗口为 0*
让我们稍微玩一玩 Beta,然后在其中创建一些窗口。我已经在上面提到过如何使用 Ctrl + B 然后 C 键 创建多个窗口。我再重复一遍。
警告:不要同时按 Ctrl 键、B 键和 C 键。首先通过按 Ctrl + B 键进入其“监听模式”,然后释放键盘,再按 C 键。
回到玩 Beta 会话:让我们在其中创建 3 个窗口。
现在,使用“tmux detach”命令退出这个 tmux 的 Beta 会话,而不是使用 exit 命令。这会把你带回你的常规终端,你的发行版在后台做了一些事情。
现在,让我们运行这个命令:
tmux ls
# 列出所有会话的名称以及每个会话中的窗口数量
它应该看起来像这样:

注意箭头
对吧,让我们稍微分解一下,
a) 它告诉你有两个会话,Alpha 有一个窗口,Beta 有 4 个窗口
按回车键或点击以全屏查看图片!
每个新会话,无论是否命名,总是从一个窗口开始,编号为 0。
b) 黄色箭头指向的窗口是我们创建的三次。然而,红色的窗口则是在会话开始时自动创建的。
8.3 附加/切换到一个会话
现在你想回到特定的会话并继续你专注的工作。我们已经学会了如何命名一个会话,这使得导航更容易。
tmux attach-session -t Alpha
# 这会把你带回 Alpha 会话。
是的,这就是可以拯救我过去版本的家伙。
- 他可以简单地在任一会话中使用 wget
- 让它在后台运行,甚至断开与平板电脑的 SSH 连接。
- 去咖啡馆,然后随时回来,继续他离开的地方。那时,那个巨大的 ISO 应该已经下载完毕。假设没有停电。
想象这个工作流程: 启动一个会话 X,让它在后台运行以完成其预定任务 从会话中分离 创建或附加/切换到另一个会话 Y。
不要在一个会话中嵌套另一个会话。这超出了本文的范围。我的意思是,你不用担心,如果你尝试做一些有趣的事情,tmux 会先警告你。
9、面板 | Tmux 的魅力
是的,我谈到了跨多个会话、多个窗口的导航。现在我们谈谈在单个窗口内的导航。这是 Tmux 的精华所在。我不知道这是否是它的正确用途。
9.1 类比
是的,最好使用 GUI 的窗口管理类比。在上面的 firefox 3 窗口布局截图中,你看到了如何通过拖拽/吸附到角落来在工作区/虚拟桌面内组织多个窗口。窗格与此类似,但不需要拖拽。记住!! Tmux 是一个 CLI 工具。鼠标就像晴天里的雨刷器一样无用。
9.2 所以面板是窗口吗??!!
不,面板不是窗口,而是一个窗口本身可以由多个面板组成。默认情况下是 1 个。你看到的那个是你输入键盘输入的窗口。
现在,这个面板可以在同一个窗口内拆分为 2 个。让我们看看如何
- 让我们连接到只有 1 个窗口的 Alpha 会话。
- 现在使用键盘快捷键进入 tmux 的监听模式,按 Ctrl + B。
- 释放按键,现在按 % 键。(这是数字行上的 5 键。根据需要使用 Shift 键。但我们要输入的是 %)
- 这会将 tmux 窗口拆分为两半,即窗格,允许多任务处理。记住,切分是垂直的。就像从顶部到底部切开一样

现在,你的活动输入区域在右侧。
9.3 在面板中导航
所以我们有 2 个窗格,但每次只有一个可以接受键盘输入。我们如何切换和导航:
使用 Ctrl + B 然后 ← . 即 Ctrl + B,释放然后左箭头。这会切换到左窗格。
顺便说一句,你在其他窗格中设置的东西将继续在后台运行。这就是 tmux 的方式。太棒了,对吧?

让我们利用这个想法,创建大量面板。

创建了 3 个面板,比例失调
如你所见,上面有 3 个面板,比例极不协调。我用来描述这种效果的最佳短语是“不当的平铺”。
我们可以通过将面板-3 不垂直而水平分割来改善这种情况。这会给你那种“整齐有序、美观的平铺外观”。
但为此,我们需要先关闭一个不需要的面板。在我们的情况下,是 3。所以我们通过 Ctrl+B(释放)然后右箭头进入面板-3
在你想要关闭的面板中输入“exit”。这个面板就永久消失了。
现在在面板-2 中,让我们创建面板-3,但让我们水平切割
水平分割的键盘快捷键是:
Ctrl + B(释放)然后 “键 — — — — — —→ 键盘上的引号键

3 个面板,整齐排列。
9.4 现在,这才是我所说的美
是的,这就结束了这篇文章。
你可能会有一些问题如下。
a) 我们可以调整面板的大小,即使在实现这种美丽的平铺布局后?
答:是的。你可以随意调整。这需要按住 Ctrl + B 键而不是释放它。这就是我没有深入探讨的原因。
b) 我需要多长时间才能熟练掌握?
答:我的朋友,放松点。这是一个 CLI(命令行界面)工具,而不是 Da Vinci Resolve,它有复杂的 UI。这里没有什么需要“学习”的。最快需要 25 分钟,最多 4 小时。这取决于你日常工作的整合。不管怎样,我建议你从控制按键组合开始。知道何时释放和何时按住是关键。
c) 它能在学术上帮助我吗?
答:哇,这个家伙问了这么多奇怪的问题。不。这与你的学业无关。它只是一个生产力工具。我在被那个巨大的 OS-Image ISO 下载惹恼时发现了这个工具。
不过,会话的概念以及 shell 和 kernel 提供它的机制很重要。在 Linux 中,GUI 也在称为“graphical-session.target”的会话中运行。还有其他常用的会话,如“multi-user.target”。所有这些都由一个称为 systemd 的守护进程管理。
d) 我可以自定义它吗?
答:尽情发挥吧,我的朋友。无论如何你喜欢。例如,Ctrl+B 键,我多次重复,也被称为 “前缀键”,可以更改 tmux 配置中的触发键,以选择你喜欢的键。该文件存储在 ~/.tmux.conf 中。去编辑它,按照你的喜好。如果你弄坏了它,卸载并重新安装 tmux。没什么大不了的。
所以,就是这样。再见。
原文链接:Learn tmux and make your life easy.
汇智网翻译整理,转载请标明出处