tmux与屏幕


262

我将重新使用GNU Screen,但我听说人们偶尔会提到tmux是更好的选择。它真的可以替代屏幕提供的所有功能,例如在不同窗口中进行活动监视等吗?各自的优缺点是什么?



2
在屏幕中,您可以通过screen -S automate_me -X stuff 'command'$(echo -ne '\015')tmux中的命令将命令发送到附加会话。如果您正在测试virtualbox ISO /映像,并且需要快速远程执行一些命令,则非常有用。例如,我在Vim命令中使用它可以在Virtualbox屏幕中快速调试脚本。在早期版本的tmux中,我发现屏幕可以快速处理更多文本,而tmux崩溃了。屏幕也不需要任何配置即可处理UTF-8等,tmux则需要。
dezza

是否tmux处理history是否正确?
beroe

Answers:


170

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

  • 状态栏更易于使用。您可以轻松地为当前窗口,带有活动的窗口等设置不同的文本/样式,并且可以在状态栏的左侧和右侧放置内容,包括可以按指定的间隔(默认为15s)运行的shell命令。
  • 几乎tmux可以在其中运行的任何命令都可以使用tmux command [args]。这使得编写脚本非常容易,并且使执行复杂命令变得容易。
  • 更精确的自动窗口重命名。虽然screen根据命令的第一个单词设置标题,并且需要shell配置甚至在shell窗口中进行配置,但tmux仍要跟踪每个窗口中实际正在运行的进程,并相应地更新标题。这样,您可以使用任何外壳和零配置进行动态重命名。例如:假设您正在运行Z Shell;该窗口的名称为“ zsh”。现在,假设您要编辑一些配置文件,因此键入sudo emacs /etc/somefile。当sudo要求输入密码时,该窗口的名称将为“ sudo”,但一旦完成并sudo启动emacs,其标题将为“ emacs”。当您完成所有操作并退出时emacs,标题将变回“ zsh”。这对于跟踪窗口非常有用,并且在特定情况下也特别有用,例如,如果您在另一个窗口中有一些长时间运行的进程,偶尔会提示您使用dialog;发生这种情况时,窗口名称将更改为“对话框”,因此您将知道必须切换到该窗口并执行某些操作。
  • 更好的会话处理(IMHO)。您可以在tmux自己的会话中做更多的事情。您可以轻松切换,重命名等,并且可以在会话之间移动和共享窗口。它也具有不同的模型,其中每个用户都有一个服务器来控制他/她的会话并与客户端连接。不利的一面是,如果服务器崩溃,您将失去一切。不过,我从来没有让服务器崩溃过。
  • tmux似乎更积极地发展。更新非常频繁,您可以根据此FAQ提交错误报告或功能请求,并在几天之内得到答案。

这些只是立即想到的主要事情。还有其他一些小事情,我确定我会忘记一些事情。不过,绝对值得tmux尝试一下。


151
tmux的开发更加活跃,因为它是新的。GNU Screen已经有25年历史了,因此他们已经修复了大多数错误。
的付费书呆子

8
付费书呆子的评论对您的最后一点很重要。除非您可以更具体地说明,否则第二点实际上并没有什么区别,因为它也适用于屏幕。
jw013


11
@apaidnerd这是一个非常丰富的声明:savannah.gnu.org/bugs/...
Błażej米哈利克

93

会话Windows的集合,可以在以后分离和重新连接。Windows可能包含一个或多个窗格。例如,configs,请在此处此处查看。)

多路复用器

  • 优点
    • 可以将键发送到其他窗格,类似于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正常工作需要一些技巧和决心
    • 疯狂的状态行配置

是否只有在按Esc时才按下按键?tmux有一个延迟,它等待着您是否正在输入xterm序列或仅输入一个单独的Esc,并与vim结合使用,看起来似乎很滞后。将退出时间设置为较低的值,例如
50。– Eevee

您说^A ^[有时不起作用也很有趣。我在屏幕上也遇到了同样的问题,但是从来没有tmux!而且我相信您可以使用来移动窗格join-pane
伊芙

我发现屏幕使用了更多的内存,这可能是缺点。
paradroid

6
好吧,tmux很糟vim,在某些情况下(即我的),任何解决方案都无法在任何地方发布,即使花一些时间解决我的问题的人也无法做到。当您无法使用<C-Left><C-Right>中时,这很烦人vim
2014年

3
No vertical splits without patch (except on Ubuntu)我认为那不是真的。我使用屏幕已经有几年了,在Debian和Fedora上水平或垂直分割时我从未遇到任何问题。即使在带有Termux的Android上,它也可以发挥作用。
Forivin

11

屏幕专家:在Linux和Solaris上几乎可以立即使用。当您必须在平台之间来回切换时,最好不要进行心理上下文切换。

我敢肯定,您可以在任何平台上编译tmux,但是有时您只有足够的访问权限才能使用屏幕,但是实际的系统管理员实际上并不想添加并非绝对必要的任何软件。


10

我已经使用tmux大约2天了,所以我对它的狂热热情还没有因打扰恼人的用例而受到抑制。在经历从一个程序到另一个程序的通常增长的痛苦时,我为几个积极的功能所震惊,但是让我相信我永远不会回到屏幕上的功能是copy-n-paste模式的实用程序。在屏幕上,您无法进入复制模式,无法在缓冲区中向后滚动,然后转到另一个窗口。在tmux中,您可以在复制模式下同时拥有多个窗口,并且缓冲区会滚动回到不同的位置。此外,还有多个复制缓冲区。而且,您无需修补源即可获得fFtT光标移动。


8

我从tmux中脱颖而出但在屏幕上不容易看到的东西是:

  1. 垂直分割窗格
  2. 多路复用,用于远程和本地配对。


如先前的文章所述,屏幕具有垂直窗格拆分(显然需要不带Ubuntu的补丁)。而且,多路复用可以正常工作并且已经使用了很多年。
EntangledLoops

screen自从2014年发布4.2以来,垂直分割一直是主流。许多发行版都发行了非常老的版本,尤其是Apple。
尼尔·福尔茨

2
这两点都不正确。
Forivin

2
答案在2018
Alec Istomin

5

我已经取代了GNU屏幕TMUX在每个用例,除了一,当我需要一个超级相当于连接到串行端口。正如Aaron Toponce在他的文章“使用GNU屏幕连接到串行空调制解调器”中指出的那样,tmux常见问题解答指出:

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

我典型的tmux用例是与tmuxinator结合创建多窗格和多窗口开发会话。如果您想学习tmux,我建议阅读Brian P. Hogan的书,tmux:无鼠标高效开发


您知道cu 调用另一个系统吗?比屏幕更简单的串行tty ,但轻巧实用!
F. Hauri

2

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

自2002年以来,我多次“调整”我的补丁程序,以将其应用于新版本的Screen。但是,当我使用版本4.3(2015)时,我注意到一个未记录的更改破坏了我对屏幕的用途之一-即“材料”现在可以插值环境变量。我不需要该功能,也无法弄清楚如何轻松地将“ stuff”的参数转义(以便我可以发送包含美元符号的文本),因此我一直使用4.0版本(从2004年开始)。

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

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

应该可以在Tmux中执行相同的操作,例如,自2015年起,就可以使用“标记”窗格的功能。或者,也许可以使用有状态的shell脚本制定出更基本的解决方案。我实现了一个简短的脚本和快捷键来尝试“标记窗格”方法,该方法工作了几次,但是Tmux崩溃了,并显示“ [丢失服务器]”。然后我发现Tmux崩溃了,即使我没有尝试做任何复杂的事情。显然,至少对于某些用户来说它已经崩溃了。有时服务器崩溃,有时服务器开始使用100%的CPU并变得无响应。我从未见过Screen可以做这两种事情。

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

正如其他发布者所提到的,Tmux具有单服务器模型,我认为这是主要缺点,尤其是在服务器崩溃时。通过为每个“会话”指定一个单独的套接字,可以解决此问题。我仍然更喜欢Screen的“每会话一台服务器”默认值,它看起来稍微优雅一些​​。

早在2002年,使用Screen代码对我来说是有教育意义的,并且很有趣。奇怪的是,对于所有其他功能,Tmux的代码行数比Screen少25%(3万对4万)。我注意到Tmux使用了许多树和列表数据结构,这对我来说有点难以理解。屏幕似乎更喜欢数组。

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

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


2

tmux的维护者之一Thomas Adam也被列为screen项目的维护者,尽管他只涉及tmux代码。这是tmux在屏幕上的巨大优势。


1

我想说屏幕的可用性是它的优势,但是它的窗口系统不如的易于处理。我必须说,我目前大部分时间都使用,因此有很多终端选项卡而不是屏幕窗口。

@Jed Schneider:您可以使用Ctrl+ A,然后|(垂直栏)获得垂直窗格拆分 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.