命令行界面(CLI)、终端(Terminal)、Shell、TTY
命令行界面(CLI)
命令行界面,通俗来讲,就是你看过的那种满屏幕都是字符的界面。命令行界面(英语:Command-line Interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。
在图形用户界面(GUI)已经完全普及的今天,普通用户在日常使用电脑的过程中几乎不用手动输入任何命令,大部分操作都是点点鼠标就能完成,而熟练使用命令行操作似乎已经成为高逼格的代名词。事实上,现在依然有着很多的软件开发者、系统管理员,或者是高级用户在使用命令行界面操作计算机。其中很大一个原因,就是效率:在熟记命令的前提下,使用命令行界面往往要比使用图形用户界面来得快。命令行操作的高效率等优点,也是现在许多图形化的计算机系统依然没有放弃提供命令行操作方式的原因。就连Windows都有自带cmd.exe和PowerShell等命令行程序。
终端(Terminal):人与机器交互的接口
在计算机领域,终端(Terminal)则是一种用来让用户输入数据至计算机,以及显示其计算结果的机器。也就是说,终端只是一种用于与计算机进行交互的输入输出设备,其本身并不提供运算处理功能。想要充分理解终端,我们得回溯历史,去看看终端的起源。
历史上的终端
在大型机(Mainframe)和小型机(Minicomputer)的时代里,计算机曾经非常昂贵且巨大,不像现在这样人手一台。这些笨重的计算机通常被安置在单独的房间内,而操作计算机的人们坐在另外的房间里,通过某些设备与计算机进行交互。这种设备就叫做终端(Terminal),也叫终端机。
早期的终端一般是一种叫做 电传打字机 (Teletype)的设备。为啥呢?因为Unix的创始人Ken Thompson和Dennis Ritchie想让Unix成为一个多用户系统。多用户系统就意味着要给每个用户配置一个终端,每个用户都要有一个显示器、一个键盘。但当时所有的计算机设备都非常昂贵(包括显示器),而且键盘和主机是集成在一起的,根本没有独立的键盘。后来他们机智地找到了一样东西,那就是ASR-33电传打字机。虽然电传打字机原本的用途是在电报线路上收发电报,但是它既有可以发送信号的键盘,又能把接收到的信号打印在纸带上,完全可以作为人机交互设备使用。而且最重要的是,价格低廉。于是,他们把很多台ASR-33连接到计算机上,让每个用户都可以在终端登录并操作主机。就这样,他们创造了计算机历史上第一个真正的多用户操作系统Unix,而电传打字机就成为了第一个Unix终端。想知道用电传打字机做终端是一种怎样的体验?这里有一个很炫酷的演示视频。
控制台(Console)
上面我们说过,在历史上,终端是连接到计算机上的一种带输入输出功能的外设。但是有一个终端与众不同,它与计算机主机是一体的,是计算机的一个组成部分。这个特殊的终端就叫做控制台(Console)。顾名思义,控制台是用于管理主机的,只能给系统管理员使用,有着比普通终端更大的权限。一台计算机上一般只有一个控制台,但是可以连接很多个终端。
上图,左边的是Console,右边的是Terminal。
放在现在我们可能难以理解为什么会有控制台和终端的区分,不过就像上一节所说的,当时都是很多个用户通过终端去访问一台计算机,而专门管理那些大块头机器的系统管理员另有其人。普通用户用的就是普通的终端,而系统管理员用的终端比较牛逼,所以就被叫做控制台。不过随着个人计算机的普及,控制台(Console)与终端(Terminal)的概念已经逐渐模糊。在现代,我们的键盘与显示器既可以认为是控制台,也可以认为是普通的终端。当你在管理系统时,它们是控制台;当你在做一般的工作时(浏览网页、编辑文档等),它们就是终端。我们自己既是一般用户,也是系统管理员。因此,现在Console与Terminal基本被看作是同义词。
字符终端与图形终端
终端也有不同的种类。字符终端(Character Terminal)也叫文本终端(Text Terminal),是只能接收和显示文本信息的终端。早期的终端全部是字符终端。字符终端也分为哑终端(Dumb Terminal)和所谓的智能终端(Intelligent Terminal),因为后者可以理解转义序列、定位光标和显示位置,比较聪明,而哑终端不行。
DEC公司在1978年制造的VT100,由于其设计良好并且是第一批支持ANSI转义序列与光标控制的智能终端,获得了空前的成功。VT100不仅是史上最流行的字符终端,更是成为了字符终端事实上的标准。随着技术的进步,图形终端(Graphical Terminal)也开始出现在公众的视野中。图形终端不但可以接收和显示文本信息,也可以显示图形与图像。著名的图形终端有Tektronix 4010系列。不过现在专门的图形终端已经极为少见,他们基本上已经被全功能显示器所取代。
终端模拟器(Terminal Emulator)
随着计算机的进化,我们已经见不到专门的终端硬件了,取而代之的则是键盘与显示器。但是没有了终端,我们要怎么与那些传统的、不兼容图形接口的命令行程序(比如说GNU工具集里的大部分命令)交互呢?这些程序并不能直接读取我们的键盘输入,也没办法把计算结果显示在我们的显示器上。
这时候我们就需要一个程序来模拟传统终端的行为,即终端模拟器 (Terminal Emulator)。严格来讲,Terminal Emulator的译名应该是「终端仿真器」。对于那些命令行(CLI)程序,终端模拟器会「假装」成一个传统终端设备;而对于现代的图形接口,终端模拟器会「假装」成一个GUI程序。一个终端模拟器的标准工作流程是这样的:
- 捕获你的键盘输入;
- 将输入发送给命令行程序(程序会认为这是从一个真正的终端设备输入的);
- 拿到命令行程序的输出结果(STDOUT以及STDERR);
- 调用图形接口(比如X11),将输出结果渲染至显示器。
终端模拟器有很多,这里就举几个经典的例子:
- GNU/Linux:gnome-terminal、Konsole
- macOS:app、iTerm2
- Windows:Win32控制台、ConEmu等
在专门的终端硬件已经基本上仅存于计算机博物馆的现代,人们通常图省事儿,直接称呼终端模拟器为「终端」。
终端窗口(Terminal Window)与虚拟控制台(Virtual Console)大部分终端模拟器都是在图形用户界面(GUI)中运行的,但是也有例外。比如在 GNU/Linux 操作系统中,按下 Ctrl+Alt+F1, F2…F6 等组合键可以切换出好几个黑色的全屏终端界面,而按下 Ctrl+Alt+F7 才是切换回图形界面。虽然它们并不运行在图形界面中,但其实它们也是终端模拟器的一种。
这些全屏的终端界面与那些运行在 GUI 下的终端模拟器的唯一区别就是它们是由操作系统内核直接提供的。这些由内核直接提供的终端界面被叫做虚拟控制台(Virtual Console),而上面提到的那些运行在图形界面上的终端模拟器则被叫做终端窗口(Terminal Window)。除此之外并没有什么差别。当然了,因为终端窗口是跑在图形界面上的,所有如果图形界面宕掉了那它们也就跟着完蛋了。这时候你至少还可以切换到 Virtual Console 去救火,因为它们由内核直接提供,只要系统本身不出问题一般都可用。
TTY
简单来说,tty 就是终端的统称。为什么呢?最早的 Unix 终端是 ASR-33 电传打字机。而电传打字机(Teletype/Teletypewriter)的英文缩写就是 tty,即 tty 这个名称的来源。由于 Unix 被设计为一个多用户操作系统,所以人们会在计算机上连接多个终端(在当时,这些终端全都是电传打字机)。Unix 系统为了支持这些电传打字机,就设计了名为 tty 的子系统,将具体的硬件设备抽象为操作系统内部位于 /dev/tty* 的设备文件。
为什么要把电传打字机这个硬件设备抽象成「tty 设备」文件呢?有兴趣的同学可以去了解一下 Unix 操作系统中 Everything is a file 的概念。
随着计算机的发展,终端设备已经不再限制于电传打字机,但是 tty 这个名称还是就这么留了下来。久而久之,它们的概念就混淆在了一起。所以在现代,tty 设备就是终端设备,终端设备就是 tty 设备,无需区分。由于早期计算机上的串行端口(Serial Port) 最大的用途就是连接终端设备,所以当时的 Unix 会把串口上的设备也同样抽象为 tty 设备(位于 /dev/ttyS*)。因此,现在人们也经常将串口设备称呼为 tty 设备。在 tty 子系统中后来还衍生出了 pty、ptmx、pts 等概念,这里就不详细展开了。有兴趣的同学可以参考一下这篇文章:Linux TTY/PTS 概述。
Shell:提供用户界面的程序
大家都知道,操作系统有一个叫做内核(Kernel)的东西,它管理着整台计算机的硬件,是现代操作系统中最基本的部分。但是,内核处于系统的底层,是不能让普通用户随意操作的,不然一个不小心系统就崩溃了。但我们总还是要让用户操作系统的,怎么办呢?这就需要一个专门的程序,它接受用户输入的命令,然后帮我们与内核沟通,最后让内核完成我们的任务。这个提供用户界面的程序被叫做 Shell(壳层)。
其实 Shell 只是提供了一个用户操作系统的入口,我们一般是通过 Shell 去调用其他各种各样的应用程序,最后来达成我们的目的。比如说我们想要知道一个文件的内容,我们会在 Shell 中输入命令 cat foo.txt,然后 Shell 会帮我们运行 cat 这个程序,cat 再去调用内核提供的 open 等系统调用来获取文件的内容。虽然并不是 Shell 直接去与内核交互,但广义上可以认为是 Shell 提供了与内核交互的用户界面。至于为什么叫做 Shell,看下图就知道啦。
Shell 通常可以分为两种:命令行 Shell 与 图形 Shell。顾名思义,前者提供一个命令行界面(CLI),后者提供一个图形用户界面(GUI)。Windows 下的 explorer.exe 就是一个典型的图形 Shell(没错,它确实是,因为它接受来自你的指令,并且会帮你与内核交互完成你的指令)。
常见或历史上知名的命令行 Shell 有:
- 适用于 Unix 及类 Unix 系统:
- sh(Bourne shell),最经典的 Unix shell;
- bash(Bourne-Again shell),目前绝大多数 Linux 发行版的默认 shell;
- zsh(Z shell),功能比上面更加强大的 shell;
- fish(Friendly interactive shell),专注于易用性与友好用户体验的 shell;
- Windows:
- exe(命令提示符)
- PowerShell。
另外还有其他各种五花八门的 Shell 程序,这里就不一一列举了,有兴趣的自己去搜一搜。
Shell 与终端的分工
现在我们知道,终端干的活儿是从用户这里接收输入(键盘、鼠标等输入设备),扔给 Shell,然后把 Shell 返回的结果展示给用户(比如通过显示器)。而 Shell 干的活儿是从终端那里拿到用户输入的命令,解析后交给操作系统内核去执行,并把执行结果返回给终端。不过 Shell 与终端的分工有一些容易混淆的地方,这里以例子进行说明:
- 终端将用户的键盘输入转换为控制序列(除了字符以外的按键,比如左方向键 → ^[[D),Shell 则解析并执行收到的控制序列(比如 ^[[D → 将光标向左移动);
- 不过也有例外,比如终端在接收到 Ctrl + C 组合键时,不会把这个按键转发给当前的程序,而是会发送一个 SIGINT 信号(默认情况下,这会导致进程终止)。其他类似的特殊组合键有 Ctrl-Z 与 Ctrl-\ 等,可以通过 stty -a 命令查看当前终端的设置。
- Shell 发出类似「把前景色改为红色(控制序列为 \033[31m)」「显示 foo」等指令
- 终端接收这些指令,并且照着 Shell 说的做,于是你就看到了终端上输出了一行红色的 foo
- 除非被重定向,否则 Shell 永远不会知道它所执行命令的输出结果。我们可以在终端窗口中上下翻页查看过去的输出内容,这完全是终端提供的 feature,与 Shell 没有半毛钱关系;
- 命令提示符(Prompt)是一个完全的 Shell 概念,与终端无关;
- 行编辑、输入历史与自动补全等功能是由 Shell 提供的(比如 fish 这个 Shell 就有着很好用的历史命令与命令自动补全功能)。不过终端也能自己实现这些功能,比如说 XShell 这个终端模拟器就可以在本地写完一行命令,然后整条发送给远程服务器中的 Shell(在连接状况不佳时很有用,不然打个字都要卡半天);
- 终端中的复制粘贴功能(Shift + Insert 或者鼠标右键等)基本上都是由终端提供的。举个例子,Windows 默认的终端对于复制粘贴的支持很屎,而换一个终端(例如 ConEmu)后就可以很好地支持复制粘贴。不过 Shell 以及其他命令行程序也可以提供自己的复制粘贴机制(例如 vim)。
图形界面与桌面环境
Linux本身没有图形界面,本身只是一个基于命令行的操作系统。在Linux系统中,可以在命令行系统中输入startx,X并不表示具体的软件,指的是协议。x.org则是实现x协议的服务器,相当于实现实现了HTTP协议的Apache、Nginx等,而各种X client好比是不同的交互界面。主流的交互界面有:GNOME、KDE、XFCE和LXDE等。
对一个习惯Windows的用户来说,要正确理解UNIX/Linux的图形环境可能颇为困难,因为它与纯图形化Windows并没有多少共同点。Linux实际上是以UNIX为模板的,它继承了UNIX内核设计精简、高度健壮的特点,无论系统结构还是操作方式也都与UNIX无异。简单点说,你可以将Linux看成是UNIX类系统中的一个特殊版本。
微软Windows在早期只是一个基于DOS的应用程序,用户必须首先进入DOS后再启动Windows进程,而从Windows 95开始,微软将图形界面作为默认,命令行界面只有在需要的情况下才开启,后来的Windows 98/Me实际上也都隶属于该体系。但在Windows 2000之后,DOS被彻底清除,Windows成为一个完全图形化的操作系统。
UNIX/Linux与之不同,强大的命令行界面始终是它们的基础,在上个世纪八十年代中期,图形界面风潮席卷操作系统业界,麻省理工学院(MIT)也在1984年与当时的DEC公司合作,致力于在UNIX系统上开发一个分散式的视窗环境,这便是大名鼎鼎的“X Window System”项目。不过,X Window并不是一个直接的图形操作环境,而是作为图形环境与UNIX系统内核沟通的中间桥梁,任何厂商都可以在X Window基础上开发出不同的GUI图形环境。MIT和DEC的目的只在于为UNIX系统设计一套简单的图形框架,以使UNIX工作站的屏幕上可显示更多的命令,对于GUI的精美程度和易用程度并不讲究,毕竟那时候能够熟练操作UNIX的都是些习惯命令行的高手,根本不在乎GUI存在与否。
1986年,MIT正式发行X Window,此后它便成为UNIX的标准视窗环境。紧接着,全力负责发展该项目的X协会成立,X Window进入了新阶段。与此同步,许多UNIX厂商也在X Window原型上开发适合自己的UNIX GUI视窗环境,其中比较著名的有SUN与AT&T联手开发的“OpenLook”、IBM主导下的OSF(Open Software Foundation,开放软件基金会)开发出的“Motif”。而一些爱好者则成立了非营利的XFree86组织,致力于在X86系统上开发X Window,这套免费且功能完整的X Window很快就进入了商用UNIX系统中,且被移植到多种硬件平台上,后来的Linux也直接从该项目中获益。当然,这些早期的X Window环境都设计得很简单,许多GUI元素模仿于微软的Windows。
由于必须以UNIX系统作为基础,X Window注定只能成为UNIX上的一个应用,而不可能与操作系统内核高度整合,这就使得基于X Window的图形环境不可能有很高的运行效率,但它的优点在于拥有很强的设计灵活性和可移植性。X Window从逻辑上分为三层:最底层的X Server(X服务器)主要处理输入/输出信息并维护相关资源,它接受来自键盘、鼠标的操作并将它交给X Client(X客户端)作出反馈,而由X Client传来的输出信息也由它来负责输出;最外层的X Client则提供一个完整的GUI界面,负责与用户的直接交互,而衔接X Server与X Client的就是“X Protocol(X通讯协议)”、它的任务是充当这两者的沟通管道。尽管UNIX厂商采用相同的X Window,但由于终端的X Client并不相同,这就导致不同UNIX产品搭配的GUI界面看起来非常不一样。
左边是Linux系统的架构,右边是Windows系统的架构,可以看到Linux比Windows中间多了一层,这就导致Linux在图形界面的性能要比Windows慢。但是苹果公司的MAC OS(Unix系统)却是个例外,因为苹果公司在X Server与X Client之间所采用的协议是二进制,而其他Linux系统均是采用的纯文本。《Linux/Unix设计思想》中有一条准则:采用纯文本文件来存储数据,原因如下:
- 文本是通用的可转换格式
- 文本文件易于阅读和编辑
- 文本数据文件简化了Unix工具的使用
- 可移植性的提高克服了速度的不足
- 速度欠佳的缺点会被明年的机器克服
KDE与GNOME
KDE项目的发起
MIT的 X Window 推出之后就成为 UNIX 图形界面的标准,但在商业应用上分为两大流派:一派是以 Sun 公司领导的 OpenLook 阵营,一派是 IBM/HP 领导的 OSF (Open Software Foundation) 的 Motif,双方经过多年竞争之后,Motif 最终获得领先地位。不过,Motif 只是一个带有窗口管理器(Window-Manager)的图形界面库(Widget-Library),而非一个真正意义上的 GUI 界面。经过协商之后 IBM/HP 与 SUN 决定将 Motif 与 OpenLook 整合,并在此基础上开发出一个名为“CDE (Common Desktop Environment)”的 GUI 作为 UNIX 的标准图形界面。遗憾的是,Motif/CDE 和 UNIX 系统的价格都非常昂贵,而当时微软的 Windows 发展速度惊人并率先在桌面市场占据垄断地位,CDE 则一直停留在 UNIX 领域提供给 root 系统管理员使用,直到今天情况依然如此。
在上个世纪九十年代中期,以开源模式推进的 Linux 在开发者中已经拥有广泛的影响力。尽管 X Window 已经非常成熟,也有不少基于 X Window 的图形界面程序,但它们不是未具备完整的图形操作功能就是价格高昂(如 CDE),根本无法用于 Linux 系统中。如果 Linux 要获得真正意义上的突破,一套完全免费、功能完善的 GUI 就非常必要。1996 年 10 月,图形排版工具 Lyx 的开发者、一位名为 Matthias Ettrich 的德国人发起了 KDE(Kool Desktop Environment)项目,与之前各种基于 X Window 的图形程序不同的是,KDE 并非针对系统管理员,它的用户群被锁定为普通的终端用户,Matthias Ettrich 希望 KDE 能够包含用户日常应用所需要的所有应用程序组件,例如 Web 浏览器、电子邮件客户端、办公套件、图形图像处理软件等等,将 UNIX/Linux 彻底带到桌面。当然,KDE 符合 GPL 规范,以免费和开放源代码的方式运行。
KDE 项目发起后,迅速吸引了一大批高水平的自由软件开发者,这些开发者都希望 KDE 能够将 Linux 系统的强大能力与舒适直观的图形界面联结起来,创建最优秀的桌面操作系统。经过艰苦卓绝的共同努力,KDE 1.0 终于在 1998 年的 7 月 12 日正式推出。以当时的水平来说,KDE 1.0 在技术上可圈可点,它较好的实现了预期的目标,各项功能初步具备,开发人员已经可以很好地使用它了。当然,对用户来说,KDE 1.0 远远比不上同时期的 Windows 98 来得平易近人,KDE 1.0 中大量的 Bug 更是让人头疼。但对开发人员来说,KDE 1.0 的推出鼓舞人心,它证明了 KDE 项目开源协作的开发方式完全可行,开发者对未来充满信心。有必要提到的是,在 KDE 1.0 版的开发过程中,SuSE、Caldera 等 Linux 商业公司对该项目提供资金上的支持,在 1999 年,IBM、Corel、RedHat、富士通-西门子等公司也纷纷对 KDE 项目提供资金和技术支持,自此 KDE 项目走上了快速发展阶段并长期保持着领先地位。但在 2004 年之后,GNOME 不仅开始在技术上超越前者,也获得更多商业公司的广泛支持,KDE 丧失主导地位,其原因就在于 KDE 选择在 Qt 平台的基础上开发,而 Qt 在版权方面的限制让许多商业公司望而却步。
Qt 是一个跨平台的 C++ 图形用户界面库,它是挪威 TrollTech 公司的产品。基本上,Qt 同 X Window 上的 Motif、OpenLook、GTK 等图形界面库和 Windows 平台上的 MFC、OWL、VCL、ATL 是同类型的东西,但 Qt 具有优良的跨平台特性(支持 Windows、Linux、各种 UNIX、OS/390 和 QNX 等)、面向对象机制以及丰富的 API,同时也可支持 2D/3D 渲染和 OpenGL API。在当时的同类图形用户界面库产品中,Qt 的功能最为强大,Matthias Ettrich 在发起 KDE 项目时很自然选择了 Qt 作为开发基础,也正是得益于 Qt 的完善性,KDE 的开发进展颇为顺利,例如 Netscape 5.0 在从 Motif 移植到 Qt 平台上仅仅花费了 5 天时间。这样,当 KDE 1.0 正式发布时,外界看到的便是一个各项功能基本具备的 GUI 操作环境,且在后来的发展中,Qt/KDE 一直都保持领先优势。有必要提到的是,TrollTech 公司实质性参与了 KDE 项目,如前面提到 Netscape 5.0 的移植工作就是由 TrollTech 的程序员完成,而 KDE 工程的发起者、Matthias Ettrich 本人也在 1998 年离开学术界加入 TrollTech,并一直担任该公司的软件开发部主管,因此 TrollTech 公司对于 KDE 项目拥有非常强的影响力。
KDE 采用 GPL 规范进行发行,但底层的基础 Qt 却是一个不遵循 GPL 的商业软件,这就给 KDE 上了一道无形的枷锁并带来可能的法律风险。一大批自由程序员对 KDE 项目的决定深为不满,它们认为利用非自由软件开发违背了 GPL 的精神,于是这些 GNU 的狂热信徒兵分两路:其中一部分人去制作 Harmonny,试图重写出一套兼容 Qt 的替代品,这个项目虽然技术上相对简单,但却没有获得 KDE 项目的支持;另一路人马则决定重新开发一套名为“GNOME(GNU Network Object Environment)”的图形环境来替代 KDE,一场因为思想分歧引发的 GUI 之战开始了。
GNOME 与 KDE 交替发展
GNOME项目于1997年8月发起,创始人是当时年仅26岁的墨西哥程序员Miguel De Icaza。GNOME选择完全遵循GPL的GTK图形界面库为基础,因此我们也一般将GNOME和KDE两大阵营称为GNOME/GTK和KDE/Qt。与Qt基于C++语言不同,GTK采用较传统的C语言,虽然C语言不支持面向对象设计,看起来比较落后,但当时熟悉C语言的开发者远远多于熟悉C++的开发者。加之GNOME/GTK完全遵循GPL版权公约,吸引了更多的自由程序员参与,但由于KDE先行一步,且基础占优势,一直都保持领先地位。1999年3月,GNOME 1.0在匆忙中推出,稳定性奇差无比,以至于许多人笑称GNOME 1.0还没有KDE 1.0 Alpha稳定,而同期的KDE 1.1.2无论在稳定性还是功能上都远胜于GNOME,直到10月份推出的GNOME 1.0.55版才较好解决了稳定性问题,给GNOME重新赢回声誉。由于思想分歧,当时GNOME的开发者与KDE的开发者在网络上吵得天翻地覆,几乎达到相互仇视的地步。但不管怎么说,GNOME都跌跌撞撞迈出了第一步,尽管那时KDE几乎是所有Linux发行版默认的桌面环境。
GNOME的转机来自于商业公司的支持。当时Linux业界的老大Red Hat很不喜欢KDE/Qt的版权,在GNOME项目发起后Red Hat立刻对其提供支持。为了促进GNOME的成熟,Red Hat甚至专门派出几位全职程序员参与GNOME的开发工作,并在1998年1月与GNOME项目成员携手成立了Red Hat高级开发实验室。1999年4月,Miguel与另一名GNOME项目的核心成员共同成立HelixCode公司为GNOME提供商业支持,这家公司后来更名为Ximian,它事实上就成为GNOME项目的母公司,GNOME平台上的Evolution邮件套件便出自该公司之手。进入2000年之后,一系列重大事件接连发生,首先,一批从苹果公司出来的工程师成立Eazel公司,为GNOME设计用户界面和Nautilus(鹦鹉螺)文件管理器。同年8月,GNOME基金会在Sun、Red Hat、Eazel、HelixCode(Ximian)的共同努力下正式成立,该基金会负责GNOME项目的开发管理以及提供资金,Miguel本人则担任基金会的总裁。此时,GNOME获得许多重量级商业公司的支持,如惠普公司采用GNOME作为HP-UX系统的用户环境,SUN则宣布将StarOffice套件与GNOME环境相整合,而GNOME也将选择OpenOffice.org作为办公套件,IBM公司则为GNOME共享了SashXB极速开发环境。同时,GNOME基金会也决定采用Mozilla作为网页浏览器。
KDE阵营也毫不示弱,在当年10月份推出万众瞩目的KDE 2.0。KDE 2.0堪称当时最庞大的自由软件,除了KDE平台自身外,还包括Koffice办公套件、Kdevelop集成开发环境以及Konqueror网页浏览器。尽管这些软件都还比较粗糙,但KDE 2.0已经很好实现了Matthias Ettrich成立KDE项目的目标。也是在这个月,TrollTech公司决定采用GPL公约来发行Qt的免费版本,希望能够以此赢得开发者的支持。这样,Qt实际上就拥有双重授权:如果对应的Linux发行版采用免费非商业性的方式进行发放,那么使用KDE无须向TrollTech交纳授权费用;但如果Linux发行版为盈利性的商业软件,那么使用KDE时必须获得授权。由于TrollTech是商业公司且一直主导着KDE的方向,双许可方式不失为解决开源与盈利矛盾的好办法。TrollTech宣称,双许可制度彻底解决了KDE在GPL公约方面的问题,但Red Hat并不喜欢,Red Hat不断对GNOME项目提供支持,希望它能够尽快走向成熟,除Red Hat之外的其他Linux厂商暂时都站在KDE这一边,但他们同时也在发行版中捆绑了GNOME桌面。
在2001-2002年,火热一时的Linux运动开始陷入低潮期,几乎所有的厂商都发现桌面Linux版本不可能盈利,而易用性的不足也让业界不看好Linux进入桌面的前途。但在服务器市场,Linux发展势头非常迅猛,直接对UNIX和Windows Server造成威胁。不过,秉承自由软件理念的开发者们并不理会外界的论调,他们一直将Linux桌面化作为目标,GNOME项目和KDE项目都在这期间获得完善发展。2001年4月,GNOME 1.4发布,它修正了之前版本的Bug,功能也较为完善,但在各方面与KDE依然存在差距;同年8月,KDE发展到2.2版本。2002年4月,KDE跳跃到3.0版本,它以Qt 3.0为基础,各项功能都颇为完备,具备卓越的使用价值;两个月后,GNOME阵营也推出2.0版本,它基于更完善的GTK 2.0图形库。进入到2003年后,KDE与GNOME进入真正意义上的技术较量。1月份,KDE 3.1推出,而GNOME 2.4则在随后的2月份推出,两大平台都努力进行自我完善。也是在这一年,Linux商业界出现一系列重大的并购案:1月份,Novell公司宣布收购德国的SuSE Linux,而SuSE Linux是地位仅次于Red Hat的全球第二大Linux商业企业;8月,Novell接着将GNOME的母公司Ximian收归旗下。这两起并购案让Novell成为实力与Red Hat不相上下的强大Linux企业,而Novell和Red Hat就成为能够影响Linux未来的两家企业。在图形环境上,SuSE一向选择KDE,并在KDE身上投入相当多的精力,在被Novell并购后,SuSE的桌面发行版尽管还侧重于KDE,但同样不喜欢Qt授权的Novell已经开始向GNOME迁移。KDE 2.0拥有丰富的应用软件,实力明显超过GNOME。
进入2004年后,KDE与GNOME依然保持快速发展,KDE阵营分别在2月份和8月份推出3.2、3.3版本,GNOME则在3月和9月推出2.6和2.8,两者的版本升级步幅旗鼓相当。到3.3版本的KDE已经非常成熟,它拥有包括KOffice、Konqueror浏览器、Kmail套件、KDE即时消息在内的一大堆应用软件,且多数都达到可用标准,功能上完全不亚于Windows 2000。而GNOME更是在此期间高速发展,GNOME 2.8版本的水准完全不逊于KDE 3.3,而且此时两者的技术特点非常鲜明:GNOME讲究简单、高效,运行速度比KDE更快;KDE则拥有华丽的界面和丰富的功能,使用习惯也与微软Windows较类似。商业支持方面,Red Hat还是GNOME的铁杆支持者,IBM、SUN、Novell、HP等重量级企业也都选择GNOME,而KDE的主要支持者暂时为SuSE、Mandrake以及中科红旗、共创开源在内的国内发行商。2005年,厚积薄发的GNOME开始全面反超,3月份的2.10、9月份的2.12让GNOME获得近乎脱胎换骨的变化,加之OpenOffice.org 2.0、Firefox 1.5等重磅软件的出台让GNOME如虎添翼;KDE方面则分别在3月和11月推出3.4和3.5,其中KDE 3.5也逼近完美境地,我们认为它的水平与GNOME 2.12不相伯仲。但KDE在商业支持方面每况愈下,Novell在11月宣布旗下所有的商业性发行版将使用GNOME作为默认桌面(仍会对KDE Libraries提供支持),SuSE Linux桌面版则会对KDE与GNOME提供同等支持,而社区支持的OpenSuSE仍将使用KDE体系—但谁都明白GNOME将成为Novell的重心,KDE只是活跃在免费的自由发行版中。备注:Qt 4.5在2009年3月3日发布,遵循了LGPL 2.1协议,放宽了KDE函数库的授权,使得平台下商业私有著作权程序的开发较原来自由。
到这里,我们发现一个颇富戏剧性的结局:致力于商业化的KDE反而失去了重量级商业企业的支持,尽管一些中小规模的Linux企业因技术能力问题将继续支持KDE,但它的商业前途有限。而遵循GPL、完全不以商业化为目的的GNOME反而在该领域大获成功。许多Linux发烧友都不明白为什么优秀的KDE会受到如此待遇,其实道理非常简单—没有哪一家重量级企业喜欢受制于人,也许KDE的Qt不需要很多授权费,但谁知道TrollTech公司以后会不会漫天要价?既然有免费的GNOME可以选择,那为什么不呢?基于此种理由,RedHat、Novell两家最大的Linux企业和SUN都采用GNOME,而它们对GNOME的鼎力支持也让该项目可拥有足够多的技术保证,为今后的高速发展奠定坚实的基础。需要纠正一个可能的误解,虽然Novell收购了Ximian,但RedHat并没有受到太大影响,双方对GNOME的贡献都是相互共享的,因为GNOME以GPL自由版权公约发行,合作即共赢。至于KDE项目,虽然它失去这些商业巨头的支持,但没有能力转换桌面的中小Linux厂商将继续追随KDE,而且在非商业的社区Linux发行版中,KDE依然有强大的生命力。
虽然在商业方面存在竞争,GNOME与KDE两大阵营的开发者关系并没有变得更糟,相反他们都意识到支持对方的重要性。如果KDE和GNOME无法实现应用程序的共享,那不仅是巨大的资源浪费,而且将导致Linux出现根本上的分裂。事实上,无论是GNOME的开发者还是KDE的开发者,他们都有着共同的目标,就是为Linux开发最好的图形环境,只是因为理念之差而分属不同的阵营。KDE与GNOME的商业竞争对开发者们其实没有任何利益影响,基于共同的目的,KDE与GNOME阵营大约从2003年开始逐渐相互支持对方的程序—只要你在KDE环境中安装GTK库,便可以运行GNOME的程序,反之亦然。经过两年多的努力,KDE和GNOME都已经实现高度的互操作性,两大平台的程序都是完全共享的,例如你可以在GNOME中运行Konqueror浏览器、Koffice套件,也可以在KDE中运行Evolution和OpenOffice.org,只不过执行本地程序的速度和视觉效果会好一些。在未来一两年内,KDE和GNOME将进行更高等级的融合,但两者大概永远都不会合为一体—GNOME还是GNOME,KDE也还是KDE。或许你觉得这是浪费开发资源而且很可能让用户无从选择,但我们告诉你这就是Linux,它与Windows和MacOSX有着绝然不同的文化。更何况全球有越来越多自由软件开发者,Linux用户的使用偏好也不可能总是相同,保持两个并行发展的图形环境项目没有什么不妥。至于GNOME项目和KDE项目的开发者们,曾经因为理念不同而吵得天翻地覆,但他们现在尽释前嫌,因为所有人都意识到,他们其实彼此需要,团结在一起可以让他们在硬件厂商面前有更大的发言权,从而促使厂商在推出Windows驱动的同时也提供相应的Linux版本,而且彼此可以相互借鉴优秀的设计,确保Linux拥有一个最出色的图形桌面环境。
QT与GTK+
从上面的信息中,我们了解到了QT与GTK授权协议层面有着较大的差别。那么除此之外还有哪些差别呢?
- GTK+:GTK+使用C语言开发,用C写面向对象所比较复杂艰涩,而且充满大量宏,使用和除错都不是很容易。虽然在思想上比较先进,但是使用起来麻烦。
- QT:Qt是一个跨平台的C++图形应用程序框架。相比GTK+,Qt的最大优势面向对象,Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。
GTK+和QT相当于Windows上的MFC。另外还有一个概念是Xlib。Xlib实际上是对底层X协议的封装,可通过该函数库进行一般的图形输出。由于Xlib的接口太原始而且复杂,因此一般的图形程序选择其他高级一些的图形库作为基础。所以才有了GTK、QT等。Xlib、QT、GTK直接关系如下图:
QT是直接使用xlib库的,GTK不能直接使用xlib,而是使用更低层的函数库GDK和Glib。其中:
- GLib == GLibray:一些基本的常用工具,以及为了提高可移植性而实现的常用函数
- GDK == GTK+DrawingKit:底层视窗系统的屏蔽和包装
这种结构使得Gtk可以更方便地移植到其它系统上,或使用与XWindows系统无关的图形库。
KDE Plasma
KDE Plasma 5是一套由KDE所编写的图形接口壳层,是KDE Plasma 4的继承者,最初稳定版本于2014年7月15日发布。KDE Plasma 5使用并建基于Qt 5及KDE Frameworks 5之上。Plasma 5.0改进了对HiDPI显示器的支持,且带来了一个融合的图形接口壳层,可以在不同的目标设备上切换不同的壳层。而一些看不见的改变则包括了迁移到了一个新的,有着完整硬件加速支持的显示堆栈,建基于OpenGL/OpenGL ES。
因为KDE Plasma 5使用并建基于Qt 5及KDE Frameworks 5之上,因此可以调整后端使用多种视窗系统来显示,包括了X11及Wayland显示协议,一直到Quartz及GDI+。
GNOME 2到GNOME 3
GNOME 2与传统桌面界面十分相似,拥有一个用户可以与不同例如窗口、图标、文件等虚拟对象交互的桌面环境。GNOME 2使用Metacity为它的默认窗口管理器。GNOME 2的窗口、程序和文件管理和一般的桌面操作系统十分相似。在默认的设置中,桌面有一个启动菜单,可以用以开启已安装的程序及文件;己存在的窗口在下方的任务栏列出;而在右上角则有一个通知区以显示在背景运行的程序。不过,这些功能可以随用户喜好而更改位置、取代或甚至移除。
在GNOME 3之前,GNOME是根据传统的桌面比拟而设计,但在GNOME 3便被GNOME Shell所取代,所有转换窗口及虚拟桌面都在“活动”画面中进行。此外,因为Mutter取代了Metacity成为默认的窗口管理器,最小化及放大按钮不再默认在名称列中。Adwaita取代了Clearlooks成为默认主题。很多GNOME核心程序都重新设计以提供更连贯的用户体验。
这些重大的改变最初引来了广泛的批评。MATE桌面环境项目由GNOME 2的源始码派生,目标为保留GNOME 2的传统界面,同时支持最新的Linux技术,例如GTK+ 3。Linux Mint团队则以开发“Mint GNOME Shell Extensions”一系列于GNOME 3上运行之插件解决此问题,这些插件使GNOME 3的界面变回传统比拟界面。最后,Linux Mint决定从GNOME 3的源代码派生另外一个桌面环境“Cinnamon”。
截至2015年,对GNOME 3的整体评价已大致转为正面。Linux发行版Debian于GNOME 3发布时把XFCE改成默认的桌面环境,但在Debian 8己改回默认使用GNOME 3。Linux创始者Linus Torvalds于2013年已改回使用GNOME 3。
Unity
Unity 是 Ubuntu 自家的桌面环境方案,是 Ubuntu 背后的 Canonical 公司开发的图形用户界面。目前还没有其它 Linux 发行版采用 Unity 作为桌面方案。Unity 运行在 Gnomes 桌面环境之上,并且使用所有 Gnome 的核心应用来构件环境。
设计之初,Unity 是由 Canonical 起初为上网本设计,在 Ubuntu 10.10 上网本版中首次推出,最初是为了充分利用上网本有限的屏幕尺寸,但 Gnome 开发组没接受 Ubuntu 团队的建议,沿用了自己方法。这时 Canonical 公司为了摆脱这种束缚,开发了自己的 shell(Unity),来更好的满足自我的需求。不同于 GNOME、KDESC,Unity 并非一个桌面包。Unity 较 GNOME 3 或 KDE 占用系统资源较多。在 Unity 桌面环境中,只有一个顶部面板,桌面左侧有一类 Dock 的应用启动器。
2017 年 4 月,Mark Shuttleworth 宣布将会在 2018 年转回使用 GNOME。Ubuntu 17.04 是最后一个预载 Unity 桌面环境的版本。Canonical 公司放弃原本桌面手机合一的路线,并将其重心转移至云计算和物联网。UBports 创始人 Marius Gripsgård 宣布将会接手 Unity 的开发。Unity 8 现由 UBports 开发及发布(目前已经更名为 Lomiri)。
MATE
MATE,为一桌面环境,由已经停止官方维护的 GNOME 2 源代码派生而来。由于 GNOME 3 在界面上的激进变动,导致诸多批评,因而许多人决定创建一个 GNOME 的派生桌面环境,维持 GNOME 2 的传统风格。更名是为了避免与 GNOME 3 的组成组件产生冲突。
MATE 与 Cinnamon 是两种非常相似的桌面环境——事实上,Linux Mint 同时支持 Cinnamon 或者 MATE 桌面环境。尽管 Cinnamon 采用了 GNOME 3 中的一部分代码并将其 fork 成一套更为传统的桌面,MATE 却做得更为彻底——采用更加陈旧的 GNOME 2 桌面代码,并在现代 Linux 发行版当中对其进行更新。Mate 是一个最直接的例子,展示了开源如何使开发人员能够对抗项目生命的终结。从理论上讲,GNOME 2 会被 GNOME 3 所取代,但它依然存在,因为一个开发人员建立了该代码的一个分支并继续发展了下去。
Cinnamon
Cinnamon 是继 MATE 之后,Linux Mint Team 为不满 Gnome 的用户创建的另一个桌面环境。不同于 Mate 基于 GNOME 2 开发,Linux Mint 团队则以开发“Mint GNOME Shell Extensions”一系列基于 GNOME 3 上的插件,这些插件使 GNOME 3 的界面变回传统界面,以此回应业界的批评。最后,Linux Mint 决定从 GNOME 3 的源码派生另外一个桌面环境,命名为 Cinnamon。
最初作为 GNOME 3 fork 之一的 Cinnamon 采用现代代码编写而成,但同时又通过重新调整为用户提供一套更为传统的桌面界面。就在 GNOME 舍弃了任务栏以及开始菜单类界面来显示已安装应用程序的同时,Cinnamon 则选择围绕这些更为传统的特性构建起自己的桌面环境。另外,相较于努力裁撤功能与选项以简化桌面效果的 GNOME 以及强调智能手机平台的 Unity,Cinnamon 始终在为桌面用户提供更多新增功能及改进。
许多 Linux 发行版都提供自己的 Cinnamon 风格支持,例如:Ubuntu、Fedora、OpenSUSE、Gentoo、Arch Linux,而且 Cinnamon 是 Linux Mint 的默认桌面环境。为了获得最佳 Cinnamon 体验,请配合 Linux Mint 一同使用。
XFCE
Xfce 是类 Unix 操作系统上的一个快捷、轻量级的桌面环境。它是为生产力而设计的,并且具备很好的可配置性,同时还符合 Freedesktop 的规范。不像 Gnome 和 KDE Plasma 等这些重量级的桌面环境,Xfce 占用的系统资源要少得多。另外,它拥有更好的模块性和更少的依赖性;它将占用你更少的磁盘空间和更少的安装时间。XFCE 非常小巧、轻便、高效,运行程序很快,对于一些比较老旧的机器、或是很少内存的机器是理想选择。以 XFCE 作为预设桌面的发行版有 Xubuntu 和 Manjaro 等。
XFCE 融合了 UNIX 开发哲学中的“模块化”和“可重用性”的重要的思想。XFCE 包含了许多组件,这些组件可以单独安装,也可以应用于其他桌面环境。用户还可以选择 GNOME 等相关软件,按照自己的需求,定制出与众不同的桌面环境。
总体来说,Xfce 目前的处境其实有点尴尬。从传统角度讲,它本来是仅次于 GNOME 与 KDE 的第三大人气选项。它在轻量化水平上稍优于 KDE 与 GNOME。而在 GNOME 3 正式发布之后,Xfce 已经成为最顶尖的“传统”Linux 桌面环境。
自那时开始,Xfce 就受到来自两位新对手的冲击。Lxde 的轻量化效果更出色,而 Cinnamon 则在功能集丰富度方面傲视群雄。从这个角度讲,MATE 的功能更为齐备,在轻量级水平上则与 Xfce 基本持平。目前 Xfce 仍然存在,不过其发展速度已经大不如前。
LXDE
LXDE,全名为 Lightweight X11 Desktop Environment,旨在提供全新轻量、快速的桌面环境,可在 Unix 以及如 Linux、BSD 等 POSIX 相容平台上运行。Lxde 目前已经成为轻量级兼用户友好桌面环境领域的王者。如果大家手头有一台古董级计算机,但又希望让它排上点用场,那么选择 Lxde 绝对没错。
不同于 Linux 的其他桌面环境,LXDE 组件依赖性极少,大多数组件可以独立运作,无需倚赖其它组件。LXDE 使用 OpenBox 作为其预设窗口管理器,并且希望能够提供建立在互相独立组件上的轻量级快速桌面环境。相较于功能强大与伴随而来的体积膨胀、占用资源,LXDE 更重视实用性和轻巧性,并且尽力降低其所耗的系统资源。虽然 XFCE 已足够轻巧,但 LXDE 更胜一筹。
LxQt
LXDE 使用 GTK+ 2,这是非常古老的代码。GTK+ 3 自 2011 年以来一直存在。LXDE 维护者 Hong Jen Yee 对 GTK+ 3 的某些更改提出了质疑,因此他于 2013 年发布了基于 Qt 的端口。不久之后,Qt 版本的 LXDE 和一个单独的桌面界面被称为 Razor-qt 合并形成 LXQt。Hong Jen Yee 计划最终将精力集中在 LXQt 上。从那时起,LXQt 正式成为一个单独的项目。
I3
i3 是一个 X11 下的平铺式窗口管理器,受到了 wmii 的启发,使用 C 语言写成。i3 支持平铺、层叠以及标签式排布窗口,并能自动实现排列,使屏幕空间得到充分利用。i3 使用纯文本文件配置,通过 Unix 域套接字与基于 JSON 的 IPC 接口也能在多种编程语言下拓展其功能。
与wmii一样,i3使用类似于vi的控制系统。默认情况下,改变窗口焦点需要同时按下Mod1键(Alt或Win)与方向键(JKL;或↑↓←→),而移动窗口则需在此基础上加上Shift键。
虽然i3是一个平铺式窗口管理器,但如密码输入框之类的特殊窗口并不会被展示为一个平铺的窗口,而是会出现在所有的平铺窗口之上,就像在GNOME或KDE等桌面环境中一样。
Budgie
Budgie是一款由Solus项目和多个社群(如Arch Linux、Manjaro Linux和Ubuntu Budgie)开发,是Solus OS的默认桌面环境。使用GNOME(如GTK+ 3.0+)的桌面环境。除了采用更现代的设计,Budgie还可以模仿GNOME 2桌面的外观和质感。Budgie的设计着重于简洁美观。
其默认桌面非常简约,只有面板和空白桌面。Budgie包含一个集成的侧边栏(称为Raven),通过它可以快速访问日历、音频控件和设置菜单。Raven还包含一个集成的通知区域,其中包含与MacOS类似的统一系统消息显示。
Pantheon
Pantheon是elementary OS操作系统的默认桌面环境。它是从头开始使用Vala和GTK3工具包写。至于易用性和外观,桌面与GNOME Shell和MacOS X有一些相似之处。
Liri
Liri是具有现代设计和功能的桌面环境。Liri是Hawaii,Papyros和Liri Project之间的合并。设计风格是Google的Material Design。
UKUI
UKUI或称Ubuntu Kylin UI,是一个基于Mate制作的桌面环境。该桌面环境的主要特点是其布局、风格和使用习惯接近传统Windows。其最新版本为UKUI 3.0。2016年,UKUI随Ubuntu Kylin 16.04 UKUI预览版发布,截至2018年,UKUI为银河麒麟社区版及优麒麟两个操作系统的默认桌面环境,并已经进入Ubuntu、Debian等Linux发行版的官方仓库。
Deepin
深度桌面环境(Deepin Desktop Environment, DDE)是Linux发行版Deepin的桌面环境。
Deepin系统曾使用GNOME桌面环境。由于GNOME桌面环境逐渐限制自定义功能,深度团队开始自行开发桌面环境,即深度桌面环境(Deepin DE,简称DDE)。该桌面环境早先使用HTML5等编写,但性能不佳,后来使用Qt重写,后端使用Go。深度桌面环境主要由桌面、启动器、任务栏、控制中心等组成。深度还维护自己的窗口管理器DDE kwin。
一些Linux发行版如Arch Linux等的软件包中也包含Deepin桌面环境。Manjaro Linux曾经也有一个叫做Manjaro Deepin的社区支持版本,该版本预装Deepin桌面环境和配套应用程序。后来Manjaro社区因为DDE尚不成熟,稳定性不佳而不再继续打包Manjaro Deepin社区版的ISO文件,但仍然可以在软件库中手动安装DDE及其相关软件。DDE也可以在Fedora 30的软件库中找到。
除了深度桌面环境(DDE),deepin系统包含多个专门针对deepin开发的软件,如深度控制中心、深度商店等,并根据GPL第三版协议开放源代码。Deepin也附带了一系列由deepin开发团队制作的应用程序,包括深度影院、深度终端、深度启动盘制作器、深度录屏、深度录音、深度截图、深度图像查看器、深度编辑器等等。
deepin继承了来自Debian stable的所有软件包,并为自己的软件库提供了流行的软件,如Vivaldi[18]。此外,Deepin系统中预装了中国大陆用户常用的WPS Office、搜狗输入法、有道词典、网易云音乐以及其它一些专为Deepin开发的应用。深之度公司是CodeWeavers公司的战略合作伙伴。CodeWeavers的CrossOver的一个版本与Deepin捆绑,现在deepin的CrossOver授权已经到期,但是deepin又自主开发了基于wine的Deepin-wine,因此deepin仍可以较好的运行一些Windows上的软件,如腾讯QQ。
参考链接: