tmux 与屏幕

Ali*_* R. 330 gnu-screen tmux

我即将重新开始使用GNU Screen,但我听到人们偶尔会提到tmux作为更好的选择。它是否真的提供了Screen提供的所有功能的替代方案,例如不同窗口中的活动监控等?各自的优缺点是什么?

qme*_*ega 204

一些(主要)的原因,我喜欢tmuxscreen

  • 状态栏更容易使用。您可以轻松地为当前窗口、带有活动的窗口等设置不同的文本/样式,并且您可以在状态栏的左侧和右侧放置东西,包括可以以指定间隔(默认为 15 秒)运行的 shell 命令。
  • 几乎您可以在其中运行的任何命令都可以tmux从带有tmux command [args]. 这使得它非常容易编写脚本,并且可以轻松执行复杂的命令。
  • 更准确的自动窗口重命名。虽然screen根据命令的第一个单词设置标题,并且需要 shell 配置甚至在 shell 窗口中执行此操作,但tmux跟踪每个窗口中实际运行的进程,并相应地更新标题。通过这种方式,您可以使用任何 shell 和零配置进行动态重命名。例如: 假设您正在运行 Z Shell;窗口的名称将是“zsh”。现在假设你想编辑一些配置文件,所以你输入sudo emacs /etc/somefile. 当 sudo 询问您的密码时,窗口的名称将是“sudo”,但是一旦您完成并sudo启动emacs,标题将是“emacs”。当你全部完成并退出时emacs,标题将变回“zsh”。这对于跟踪窗口非常有用,并且在特定情况下也特别有用,例如如果您在另一个窗口中有一些长时间运行的进程偶尔会使用dialog;提示您输入;发生这种情况时,窗口名称将更改为“对话框”,因此您会知道必须切换到该窗口并执行某些操作。
  • 更好的会话处理(恕我直言)。您可以使用会话tmux本身做更多的事情。您可以轻松切换、重命名等,还可以在会话之间移动和共享窗口。它还具有不同的模型,其中每个用户都有一个服务器来控制他/她的会话并且客户端连接到该服务器。这样做的缺点是,如果服务器崩溃,您将失去一切;不过,我从来没有遇到过服务器崩溃。
  • tmux似乎得到了更积极的发展。更新非常频繁,您可以根据此常见问题提交错误报告或功能请求,并在几天内得到答复。但是,正如评论中指出的那样,screen缺乏发展主要是因为它很稳定。基本完成了,没有放弃。也就是说,如果它现在不能做某事,它可能永远也做不到,而且长期存在的问题不太可能得到解决。(不过,公平地说,垂直分割是screen我第一次回答这个问题时没有的一个功能,现在有了。)

这些是我个人从 screen 切换到 tmux 的一些原因。这并不是说屏幕没有优势,但 FWIW 我想不出自从切换以来我错过了什么。付费书呆子的另一个答案有一个更客观的优点/缺点列表,尽管我会说我从来没有遇到过那里提到的崩溃或错过击键的问题。(那些可能依赖于操作系统。我只在 Linux 和 FreeBSD 上使用过它。)

  • tmux 开发更加活跃,因为它是 _new_。GNU Screen 几乎 ** 25 岁**,所以他们已经修复了大部分错误。 (180认同)
  • @一个付费书呆子:http://www.techrepublic.com/blog/opensource/is-tmux-the-gnu-screen-killer/1901 (16认同)
  • @apaidnerd 这是一个非常丰富的声明:https://savannah.gnu.org/bugs/?group=screen&func=browse&set=open&msort=0&advsrch=0&morder=bug_id%3C&offset=150#results (12认同)
  • 付费书呆子的评论是你最后一点的一个非常重要的资格。如上所述的第二点并没有真正的区别,因为它也适用于屏幕,除非您可以更具体。 (8认同)
  • RHEL8.0.0 中不推荐使用 `screen` 包。 (3认同)

a p*_*erd 109

会话是可以在以后分离和重新附加的窗口集合。Windows 可能包含一个或多个窗格。例如配置,请查看此处此处。)

多路复用器

  • 优点
    • 可以将密钥发送到其他窗格,有点像 IDE
    • 简单的按键绑定——使用正确的配置,你会在 Vim 或 Screen 上感到宾至如归
    • 内置 Vim-ish 和 Emacs-ish 绑定
    • 良好的布局管理,很像平铺窗口管理器
    • Unicode 似乎只适用于现代终端
    • 修复了一些终端问题 TERM=tmux
  • 缺点
    • 慢——不知道为什么,但击键似乎迟钝 不再有缓慢的问题
    • 多路复用强制整个会话宽度和高度到最小的连接终端
    • 在 Mac OS X 上多次崩溃,丢失了整个会话
    • 升级后在 Linux 上失败,我无法重新连接到旧会话
    • 偶尔会错过命令击键 -^A ^[需要尝试几次复制模式
    • 无法将窗格从一个窗口移动到另一个窗口使用join-pane命令修复
    • 终端宽度更改(窗口大小调整)后没有行展开(或“回流”或“重新包装”)

GNU 屏幕

  • 优点
    • 非常稳定(v1.0 是在 1987 年)
    • 修复了一些终端问题 TERM=screen
    • 内置 Emacs-ish 绑定
    • 易于移动和控制水平窗格
    • 多路复用时,任何连接的终端都可以调整窗格的大小
  • 缺点
    • 没有补丁就没有垂直分割(除了在 Ubuntu 上)最近版本的屏幕支持垂直分割
    • 分离时窗格拆分丢失
    • 让 Unicode 工作需要一点技巧和决心
    • 复杂混乱的状态行配置

  • 嗯,`tmux` 和 `vim` 很糟糕,在某些情况下(即我的),没有任何解决方案发布在任何地方有效,甚至人们花一些时间解决我的问题也无法解决。当你不能在 `vim` 中使用 `<C-Left>` 和 `<C-Right>` 时,这很烦人。 (8认同)
  • `没有补丁就没有垂直分割(Ubuntu 除外)` 我认为这不是真的。我已经使用 screen 几年了,在 Debian 和 Fedora 上水平或垂直拆分我从来没有遇到过任何问题。即使在带有 Termux 的 Android 上,它也能像魅力一样工作。 (4认同)

Jus*_*tin 23

屏幕的专业人士:它在 Linux 和 Solaris 上几乎是开箱即用的。当您必须在平台之间来回切换时,最好不要进行心理上下文切换。

我相信你可以在任何平台上编译 tmux,但有时你有足够的访问权限来使用 screen,但实际的系统管理员并不真的想添加任何不是绝对必要的软件。

  • RHEL / Centos 8 已删除 [GNU 屏幕](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/considerations_in_adopting_rhel_8/changes-to-packages_considerations-in-adopting-rhel-8#removed -packages_changes-to-packages)。不过仍然是 Ubuntu 20.04 LTS。 (4认同)
  • 谢谢你,@sastorsl。此页面有一些附加信息和有趣的评论:https://access.redhat.com/solutions/4136481 (2认同)

Wil*_*ell 15

我已经使用tmux了大约 2 天了,所以我对它肆无忌惮的热情还没有因为遇到烦人的用例而受到影响。

在经历从一个程序过渡到另一个程序的常见成长痛苦时,我被几个积极的功能所震惊,但让我相信我永远不会回到屏幕的功能是复制粘贴模式的实用程序。

在 中screen,您不能进入复制模式,在缓冲区中向后滚动,然后转到另一个窗口。

在 中tmux,您可以在复制模式下同时拥有多个窗口,并将缓冲区滚动回不同的位置。此外,还有多个复制缓冲区。而且您无需修补源即可获得 fFtT 光标移动。

  • *“在屏幕中,您无法进入复制模式,在缓冲区中向后滚动,然后转到另一个窗口。”* 也许自 2012 年以来这已经发生了变化,但我刚刚尝试过,它工作正常。 (4认同)

Mat*_*kin 11

我在每个用例中都用tmux替换了GNU Screen,除了一个——当我需要一个等效的超级终端来连接到串行端口时。正如 Aaron Toponce 在他的文章“使用 GNU Screen 连接到串行空调制解调器”中指出的那样,tmux 常见问题解答指出:

screen 具有内置的串行和 telnet 支持;这是膨胀的,不太可能被添加到 tmux。

我的典型tmux用例是结合tmuxinator创建多窗格和多窗口开发会话。如果您想学习tmux,我建议您阅读 Brian P. Hogan 的书tmux: Productive Mouse-Free Development

  • 你知道`cu` *调用另一个系统*吗?比 *screen* 更简单的串行 tty,但轻巧实用! (3认同)

Jed*_*der 8

我从 tmux 中得到的东西我在屏幕上不容易得到的是:

  1. 进行垂直窗格拆分
  2. 多路复用,我们用于远程和本地配对。

  • [屏幕不支持使用`-x` 选项和`acladd` 进行多路复用吗?](http://aperiodic.net/screen/multiuser) (8认同)
  • 2018年答案不正确 (4认同)
  • 自 2014 年发布的 4.2 以来,垂直拆分一直在主线 `screen` 中。许多发行版发布了*非常* 的旧版本,尤其是 Apple。 (3认同)
  • 这两点都不正确。 (3认同)

Met*_*hic 7

很长一段时间以来,我一直是 Screen 的重度用户,但我使用的是我在 2002 年修改过的版本。主要是因为我希望能够让窗口“下一个/上一个”导航顺序与新的顺序匹配创建了窗口,类似于像i3Ion这样的平铺窗口管理器。标准的屏幕行为是让“下一个”和“上一个”按窗口编号进行,因此通常“新”窗口(获取最小的可用编号)将位于“下一个”窗口之外的其他位置-如果您不这样做会造成混淆不记得数字。我的首选行为已在 Tmux 中实现,作为2010 年 new-window 命令的标志,以及2012 年renumber-windows 选项. 我的 Screen 补丁,我试图使其尽可能被接受,包括文档添加等,但在 2002 年 7 月的 Screen 列表中没有引起任何讨论(然后“screen@informatik.uni-erlangen.de”,不能找到档案)。事实上,它甚至没有被承认,即使我一年后再次发送它。

自 2002 年以来,我多次“重新调整”我的补丁以应用于较新版本的 Screen。然而,当我到达 4.3 (2015) 版本时,我注意到一个未记录的更改破坏了我对 screen 的一个使用 - 即“东西”现在插入环境变量。我不需要那个功能,我不知道如何轻松地将参数转义为“东西”(以便我可以发送包含美元符号的文本),所以我一直使用 4.0 版(从 2004 年开始)。

我在 Emacs 函数中使用 Screen 的“东西”(Tmux 中的“发送键”),该函数将当前 Emacs 区域的内容发送到特定窗口编号。这样,当我用脚本语言编写代码时,我打开一个解释器,我给解释器窗口一个特殊的编号,然后我可以使用这个 Emacs 绑定将代码行从我的编辑器窗口直接发送到解释器窗口。它很老套,但我比纯 Emacs 解决方案更喜欢它,因为我还可以使用标准击键在其屏幕窗口中与解释器进行交互。它有点像 GUI IDE,但我不必使用鼠标或盯着闪烁的光标。

我在补丁中实现的另一个功能是能够“标记”一个窗口,然后将标记的窗口重新定位为当前窗口之后的“下一个”。对我来说,这是一种比重新编号更自然的窗口重新排序方式;它就像复制/粘贴范例,或“拖放”。(我最近也想出了如何在 i3 中做到这一点。)

应该可以在 Tmux 中做同样的事情,例如从 2015 年开始,有一个用于“标记”窗格的工具。或者也许可以使用有状态的 shell 脚本来制定更基本的解决方案。我实现了一个简短的脚本和键绑定来尝试“标记窗格”方法,它工作了几次,但随后 Tmux 因“[丢失服务器]”而崩溃。然后我发现即使我没有尝试做任何复杂的事情,Tmux 也会崩溃。显然,它已经崩溃对于一些用户在至少几年的时间。有时服务器崩溃,有时它开始使用 100% 的 CPU 并变得无响应。我从来没有见过 Screen 做这些。

理论上,Tmux 在几个方面优于 Screen。它具有更好的脚本能力,这意味着您可以执行诸如从命令行查询当前会话中的窗口列表之类的操作,而 Screen 则无法做到这一点。例如,在 2015 年 Screen添加了一个命令“按标题排序窗口”。我不确定这样的专用命令何时会有用,但是可以从 Tmux 中的 shell 脚本相对容易地完成这个和更实际的变化(例如,按 CPU 使用率对窗口进行排序)。对我来说,在 Screen 中做任何如此有创意的事情似乎很难,至少在不修改 C 代码的情况下是这样。

正如其他海报所提到的,Tmux 有一个单服务器模型,我认为这是主要缺点,特别是当服务器崩溃时。可以通过为每个“会话”指定一个单独的套接字来解决这个问题。我仍然更喜欢 Screen 的每会话一台服务器的默认设置,这看起来更优雅一些。

早在 2002 年,使用 Screen 代码对我来说是一种教育和乐趣。奇怪的是,对于所有附加功能,Tmux 的代码行数比 Screen(30k 对 40k)少约 25%。我注意到 Tmux 使用了许多树和列表数据结构,这对我来说有点难以理解。Screen 似乎更喜欢数组。

据我了解,因为Unix终端接口非常稳定,所以几乎不需要Screen或Tmux代码去适应底层操作系统的变化。这些程序实际上并没有像 Web 浏览器或 Web 服务器甚至 shell 那样的安全更新。我没有注意到运行我的自定义版本的 Screen 有任何问题,最后一次更新是在 2004 年(除了需要添加一些配置文件以防止 Systemd 删除套接字; 无论如何,这些文件通常是分发包的一部分)。也许我可以通过在 Tmux 开始崩溃之前运行一个 Tmux 版本来解决我在 Tmux 中遇到的问题。当然,如果有足够多的用户这样做,那么这对新用户来说不是很好,因为这意味着更少的专家会在这些程序的最新官方版本中寻找错误。但是,很难激励自己切换到对我来说不稳定的产品(最新的 Tmux)或缺少我想要的某些功能(标准屏幕)。

我知道这并不能为 OP 的问题提供一个简单的答案,但我希望我的观点是有用的。