如何在 Linux 上使用 tmux(以及为什么它比 Screen 好)

摘要:从您的 Linux 发行版存储库安装 tmux,然后在 Linux 终端中运行“tmux”。您可以为每个 tmux 会话指定一个唯一的名称,在每个会话中创建窗口,并将这些窗口放入窗格中。
Linux tmux
命令是一个终端多路复用器,类似于 screen
。它的拥护者很多而且声音很大,所以我们决定比较两者。 tmux
真的更好,还是只是更喜欢你所知道的?
tmux 与屏幕
tmux
和 GNU screen
命令都是终端多路复用器。它们允许您在单个终端窗口中拥有多个窗口,并在它们之间来回跳转。一个窗口可以分为多个窗格,每个窗格都为您提供一个独立的命令行。
您还可以分离一个会话,它变成一个在后台运行的无头实体——您甚至可以关闭启动它的终端窗口。准备就绪后,您可以打开一个新的终端窗口并重新连接仍在运行的会话。您也可以通过 SSH 连接执行此操作。
您可以分离一台计算机上的会话,回家,然后登录到远程计算机。重新连接后,您可以重新附加后台会话并再次以交互方式使用它。
屏幕命令是什么?
screen
命令也是一个终端多路复用器,它包含很多选项。有关您可以使用它做的所有事情的内幕,请查看我们的深度文章。
这一次,我们将专注于 tmux
。随着我们的进行,我们将提到 screen
如何处理相同的特性或功能。
关于 screen
,只有一件事让我们烦恼。我们会在谈到它时介绍它,看看 tmux
是否有更好的表现。
安装 tmux
虽然 screen
通常默认安装在流行的 Linux 发行版上,但 tmux
不是。要在 Ubuntu 上安装 tmux
,请键入以下内容:
sudo apt-get install tmux

在 Manjaro 上你可以使用 pacman
:
sudo pacman -Sy tmux

在 Fedora 31 上,tmux
已经安装。
启动 tmux 会话
要启动 tmux
,只需键入它并按 Enter:
tmux

当您处于 tmux
会话中时,终端窗口将显示一个状态栏。

状态栏右侧显示主机名、时间和日期。左侧显示以下会话相关信息:
- [0]:这是会话名称。默认情况下,它们从零开始编号。我们将在下面介绍如何为会话指定有意义的名称。
- 0:bash*: 0 表示这是本次会话中的第一个窗口。在此会话中运行的唯一进程是
bash
。如果您运行一个程序,它的名称将出现在这里。星号 (*) 表示这是您正在查看的窗口。每次您在tmux
会话中创建一个新窗口时,它的窗口编号和其中运行的程序的名称都会添加到状态栏。
默认情况下,screen
命令不会为您提供状态栏。你必须盲目飞行并依靠你的智慧来知道发生了什么,这需要一些练习。 (除非您配置自己的状态栏。)
从好的方面来说,您不会失去一行终端窗口空间。当然,您通常会扩展终端窗口以使使用终端多路复用器变得有价值。在那种情况下,状态栏丢失一行并不是什么大问题。我们将终端窗口的图像保留为默认大小,以便您可以看到信息。
使用击键将命令提供给 tmux
,这有两个部分。首先,您按下 Ctrl+B 以引起 tmux
的注意。然后,您快速按下一个键以向 tmux
发送命令。命令是通过按字母、数字、标点符号或箭头键给出的。
它在 screen
中是一样的,除了你按下 Ctrl+A 来引起它的注意。
要关闭窗口,请按 Ctrl+B,然后快速按 X。状态栏变为琥珀色。然后系统会提示您确认要关闭窗口。
如果您改变主意,请按 Y 关闭窗口或按 N。之后您不必按 Enter 键; Y 或 N 足以注册您的选择。

如果按 Y,窗口将关闭。因为这是此会话中的唯一窗口,所以会话终止。

tmux
会话关闭,您将返回到启动 tmux
的命令行。您会在终端窗口中看到“[exited]”。
这可能看起来像是在陈述显而易见的事实,但这是对您已关闭会话而不是让它分离并运行的确认。我们将在下面讨论分离会话。
启动一个命名的 tmux 会话
如果您定期启动多个 tmux
会话,您很快就会体会到为每个会话赋予一个有意义的名称的功能。您也可以在 screen
中命名会话,但它们不会显示在会话窗口的任何位置。
要使用会话名称启动 tmux
,请使用 new
(新会话)命令和 -s
(会话名称)选项。我们的会话将被称为“geek-1”,因此我们输入以下内容:
tmux new -s geek-1

当加载 tmux
会话时,“geek-1”显示为状态栏中的第一个条目,位于最左侧。

添加更多窗口
要在当前会话中创建一个新窗口,请按 Ctrl+B,然后按 C。您将在当前会话中获得一个空白终端窗口。所以我们将在这个新窗口中运行一些东西,让我们使用 -w
(跟随)选项启动 dmesg
命令:
dmesg -w

现在我们在会话中有两个窗口;一个运行 top
,另一个运行 dmesg
。不过,我们一次只能看到一个(稍后会详细介绍)。

看一下状态栏的左侧。我们仍在“geek-1”tmux
会话中。在窗口 0 中,top 正在运行,在窗口 1 中,dmesg
正在运行。 dmesg
之后的星号 (*) 告诉我们哪个窗口是可见的。
要在窗口之间跳转,请按 Ctrl+B,然后按以下键之一:
- N:显示下一个窗口。
- P:显示上一个窗口。
- 0 到 9:显示编号为 0 到 9 的窗口。
您还可以从列表中选择一个窗口。如果按 Ctrl+B,然后按 W,将出现一个窗口列表。

要移动琥珀色高亮条,请按向上或向下箭头、Home 或 End。显示屏的底部显示了突出显示窗口中内容的预览。
按 Enter 移动到突出显示的窗口,或按 Esc 离开窗口列表而不切换。
分离和附加会话
如果您按 Ctrl+B,然后按 D,您将分离会话。它将继续在后台运行,但您将无法看到它或与之交互。
我们在会话中启动了 top
,所以我们有一个正在运行的进程来演示。然后,我们按Ctrl+B,再按D。会话消失,变成后台会话。

我们返回到原来的终端窗口。 tmux
有一条消息告诉我们会话已分离。它还让我们想起了我们给会议起的名字。这很方便,因为我们用它来附加到后台会话,然后将其恢复为交互式会话。
要附加一个分离的会话,我们将使用不言自明的 attach-session
命令和 -t
(目标会话)选项。我们还将提供我们希望召回的会话的名称。
我们键入以下内容:
tmux attach-session -t geek-1

我们的会话返回并再次成为可见的交互式会话。

当您附加会话时,您在分离会话之前启动的任何长时间运行或持续的进程仍将在后台运行(除非它们已经完成)。
screen
可以做到这一点,但不够直观。
处理多个会话
让我们打开另一个终端窗口,并启动一个名为“geek-2”的新 tmux
会话:
tmux new -s geek-2

在该会话中,我们将启动 dmesg
:
dmesg -w

现在,我们有了最初的“geek-1”tmux
会话,以及一个名为“geek-2”的新会话。

状态栏向我们显示此会话称为“geek-2”,并且它有一个运行 dmesg
的窗口。
如果我们按 Ctrl+B,然后按 D,我们将分离该会话。

回到“geek-1”tmux
会话,我们按 Ctrl+B,然后按 S 以查看 tmux
会话列表。

需要明确的是,这是一个会话列表。我们之前看到的类似显示是单个会话中的窗口列表。
您可以通过按向上和向下箭头、Home 和 End 来移动琥珀色高亮栏。底部部分显示突出显示的会话中的内容预览。

如果按向右箭头,则会显示突出显示的会话的窗口。

按 Enter 移动到突出显示的会话或窗口,或按 Esc 离开会话列表而不更改会话。如果您选择一个新会话,您当前的会话将分离,而您选择的会话将被附加。
在我们这样做之前,我们分离了“geek-2”会话。但是,您可以对仍附加到其原始终端窗口的会话执行此操作。当您这样做时,任何屏幕更改都将同时出现在两个 tmux
会话中。
screen
命令也可以通过一组类似的命令来执行此操作。
使用窗格
如果按 Ctrl+B,然后按双引号 (“”),则将窗口水平拆分为两个窗格。

这只会影响当前窗口;会话中的其他人不会改变。我们在顶部窗格中使用了 tmux ls
命令来列出此会话中的窗口。有两个,状态行告诉我们我们在第一个窗口。如果我们按 Ctrl+B 跳到窗口零,然后按 0(零),我们会看到它和我们离开时一样。
这是两个独立的命令行,而不是一个窗口中的两个视图;它们是不同且独立的外壳。我们可以通过在每个窗格中运行不同的命令来显示这一点。
我们键入以下内容:
<代码>uname -a
<代码>ls -hl
要从一个窗格移动到另一个窗格,请按 Ctrl+B,然后按向上、向下、向左或向右箭头。

如果您按 Ctrl+B,然后按百分号 (%)
,它会垂直拆分当前窗格。

按 Ctrl+B,然后按 Q 使 tmux
短暂闪烁每个窗格的编号。

这些数字用于来自 tmux
的提示和消息。按 Ctrl+B,然后按 X 关闭当前窗格。状态栏变为琥珀色,系统会提示您确认是否要关闭该窗格编号。按 Y 删除窗格,或按 N 保持原样。

如果按 Y,则删除窗格。

screen
命令也有窗格,但同样,它们使用起来不太直观。 screen
让我们烦恼的是,如果您分离带有窗格的会话,它们会在您重新附加该会话时消失。这很快就会变老。
Ctrl+B 备忘单
我们在下面的 tmux
中包含了您可以使用的不同命令的备忘单。
会话命令
- S:列出会话。
- $:重命名当前会话。
- D: 分离当前会话。
- Ctrl+B,然后按 ?: 在
tmux
中显示帮助页面。
窗口命令
- C: 创建一个新窗口。
- ,:重命名当前窗口。
- W:列出窗口。
- N:移至下一个窗口。
- P:移至上一个窗口。
- 0 到 9:移动到指定的窗口号。
窗格命令
- %:创建水平拆分。
- “:创建垂直拆分。
- H 或向左箭头:移至左侧窗格。
- I 或向右箭头:移动到右侧的窗格。
- J 或向下箭头:移动到下面的窗格。
- K 或向上箭头:移动到上面的窗格。
- 问:简要显示窗格编号。
- O:按顺序在窗格中移动。每按一次都会将您带到下一个,直到您循环遍历所有这些按钮。
- }:将当前窗格的位置与下一个交换。
- {: 将当前窗格的位置与前一个交换。
- X:关闭当前面板。
他们如何比较
在功能方面,screen
和 tmux
的性能相似,并提供相同的主要功能。这是您访问这些功能的方式明显不同。 tmux
提供了更流畅、更舒适的方式来使用各种功能。但是,这不是唯一的区别。
在 tmux
中重命名会话和窗口的能力非常好,而且当您重新连接会话时它会保留窗格这一事实改变了游戏规则。
另一方面,screen
在您分离并重新附加会话时会完全丢失窗格。这几乎足以让你从一开始就避免分离。
tmux
还有很多其他功能,包括其极其灵活的脚本功能。你应该自己检查一下。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts