在使用 Ubuntu 的过程中,我们不可避免的要使用一个名为 Terminal 的东西,也一定会遇到一些叫 X、X11、GNOME、KDE 等等这些名词的东西。今天就总结一下这些玩意到底是啥,以及分别有哪些功能及用途。

架构

  在介绍各个名词的具体含义之前,我们先来简单看一下 Linux 系统的整体架构,同时以比较熟悉的 Windows(这里指的是 Windows NT 内核) 架构作为对比,如下图所示:
在这里插入图片描述
结合上图中,我们需要了解以下这几点:

  1. 现在,Linux 这个名称代表了 Linux 系统,Linux Kernel 表示内核。在最初,Linux 本身就是一个内核,只有加上其他一些组件之后才是我们熟悉的真正意义上的系统。后来,随着 Linux 的流行,人们逐渐默认了 Linux 就代指系统。理解这个概念非常重要。
  2. Windows NT 系统将 GUI 放到了内核之中,他们的图形界面是操作系统的一部分;而 Linux 系统中,GUI 属于用户层功能。这可以算是 Linux 与 Windows 一个重要的不同点。

Shell

  Shell 这个东西主要是相对于系统内核来说的。内核处于系统的底层,负责管理计算机的所有硬件资源,是不允许用户随意操作的,而操作系统又必须与人交互,因此,在操作系统设计中,Shell 这个概念就应运而生了。Shell 是一种命令解释程序,它包裹着内核向使用者或其他程序暴露操作系统的服务。
在这里插入图片描述
  Shell 是操作系统提供的一种用户界面(命令行界面),提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。 Linux 系统中,在不安装 GUI 界面时,我们看到的黑色界面就是 Shell。

  通常,Shell 可以分为两类:命令行 Shell图形界面 Shell。命令行 Shell 提供一个命令行界面(CLI);而图形 Shell 提供一个图形用户界面(GUI)。我们通常所说的 Shell 一般指的就是命令行 Shell。 常见的命令行 Shell(Unix Shell):

  • sh: 第一个 Shell 是由贝尔实验室的 Ken Thompson 编写,被称为 Thompson shell,并在 1971 年到 1975 年随 Unix 版本 1 到 6 一起发布。后来,Stephen Bourne 重新实现了一版新的 Shell(Bourne shell,仍然使用简写 sh),并于 1979 年作为 UNIX Version 7 的 shell 发布。
      sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。
  • csh: sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
    Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。
  • tcsh: tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
  • Almquist shell (ash): 一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境。它是使用 BSD 许可的,用于替代 Bourne Shell 的。
  • KornShell (ksh): 是 David Korn 基于 Bourne shell 的源码写的
  • Bourne-Again shell (bash): bash shell 是 Linux 的默认 shell。由 GNU 组织开发,以提供一个Bourne Shell功能的超集,是各种 Linux 发行版默认配置的 shell。
  • Z shell (zsh): Z shell 是一个相对现代的 shell,向后兼容 bash。这是自 2020.4 年以来的 Kali Linux 和 macOS 10.15 开始的 mac 默认的 shell。

Windows 系统中,cmd 也算是个命令行 Shell。常见的图形界面 Shell:

  • Windows 系统中的 explorer
  • Mac 的 访达

当前 Linux 系统可用的 Shell 都记录在/etc/shells文件:
在这里插入图片描述

终端(Terminal)

  在计算机发展初期,计算机非常大,动不动就是上吨级别的。因此,计算机一般都是放到一个单独的房间中,而人们往往是在另一个地方通过一定的手段(设备)去操控计算机,操控计算机的这个设备就被称为终端,也叫做终端机。终端其实就是一种输入输出设备,相对于计算机主机而言属于外设,本身并不提供运算处理功能。

  早期的终端只有文本终端,就是那种只能接收和显示文本信息的终端。1978 年,DEC 公司制造出了一台支持 ANSI 转义序列与光标控制的智能终端,获得了空前的成功。
在这里插入图片描述
后来,随着技术的进步,图形终端开始出现在公众的视野中,它不仅可以接收和显示文本信息,还可以显示图形和图像。慢慢的,图形终端也逐渐消失。

  再后来,随着个人计算机的普及,终端的含义也慢慢出现了变化。因为个人计算机不再需要一个额外的终端来操作计算机,所有操作都直接在个人计算机上完成了。但是,计算机操作系统中已有的终端设计却一直保留了下来,终端模拟器(Terminal Emulator)软件出现了。这些终端模拟器也被简称为终端。例如:

  • Linux 下常用的终端模拟器有:Konsole、Xiki。
  • MacOS 下常用的终端模拟器有:Terminal.app(系统自带)、iTerm2。
  • Windows 下常用的终端模拟器有:Windows Terminal(集成了 Powershell、Cmd)、XShell。

  在现代化操作系统软件领域中的终端就是操作系统中的一个软件,这个软件提供是文本输入和输出环境,是一个允许你运行命令行 Shell 程序的地方,是操作系统与用户进行实际交互的地方。

  Terminal 负责从用户(通过键盘和鼠标)这里接收输入,然后扔给 Shell 去执行,最后再把 Shell 返回的结果展示给用户(通过显示器)Shell 负责从 Terminal 那里拿到用户输入的命令,解析后交给操作系统内核去执行,然后把执行结果返回给 Terminal。
在这里插入图片描述

控制台(Console)

  控制台这个概念其实很好理解,很多大型设备都有一个控制台用来操作设备。在计算机领域,控制台的概念也是伴随着计算机发展初期而诞生的。通常,控制台和计算机本身是一体的,供管理员来操作计算机,有着比普通终端更大的权限。
在这里插入图片描述
  通常,一台计算机只有一个控制台,且支持与多个终端进行连接。同样随着个人计算机的普及,控制台的改进也引入软件领域,控制台就是操作系统提供的一个控制计算机的界面。

  Terminal(终端)其实是处于用户使用系统的角度来说的,相对于提供服务的系统,终端是用户使用这个系统的入口,这个名词的使用范围比 Console 要广。而 Console(控制台)则强调是控制系统(几乎就是大机了)的地方,其使用者主要是管理员。Console 是一个功能更强的 Terminal。

  不过,随着计算机的发展,控制台和终端的概念已经逐渐模糊,Console 与 Terminal 基本可以看作是一个东西。尤其是在现代化操作系统中,Console 与 Terminal 基本指通同一软件,或者说具有类似功能的一类软件。

CLI(Command-line Interface)

  维基百科给出的定义是:命令行界面(Command-line Interface,CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。 命令行界面是用户界面的一种。在计算机初期,命令行界面是用户于计算机交互的主要方式。
在这里插入图片描述
  命令行界面就是命令行 Shell 提供的用户与计算机进行交互的方式,用户通过键入操作系统定义的各种命令来控制计算机。 在 Linux 系统中,如果我们不安装图形用户界面,开机后看到的那个黑色屏幕就是 Linux 默认的 Shell 命令行界面。命令行界面是从人类曾经通过远程打印机(TTY)机器进行的对话形式演变而来的。

  早期的微型计算机都只有命令行界面,在 20 世纪 八九十年代,苹果 Macintosh 和微软 Windows PC 上引入图形用户界面,并逐渐代替了命令行界面。但是,命令行界面并没有被删除,而是保留至今,并得到了不断改进。

GUI(Graphical User Interface)

  命令行界面的软件通常需要用户记忆各种操作的命令,因此在使用上入门门槛要高一些。在后来个人计算机逐渐普及时,苹果和微软则将重心放到了图形用户界面上,并逐渐成为了我们目前看到的 Windows 和 Mac 图形界面。
在这里插入图片描述
  图形用户界面即图形界面 Shell,其引入了窗口、桌面、菜单、快捷键、鼠标操作等新的操作方式,并在个人计算机用户中已经基本代替了命令行界面的 Shell。但是,当前操作系统都保留了原来的命令行的形式,只不过通常以终端的形式提供给用户使用。在终端中用户可以像以前一样执行各种 Shell 命令。

  Linux系统(内核)本身没有图形界面,Linux 中的图形界面实现只是 Linux 下的应用程序实现的。这不同于 Windows,Windows 系统(NT 内核)中,图形界面是内核的一部分,也不同于 MacOS,MacOS 也将图形界面的部分功能放到了内核中。放到内核中的一大优势就是图形用户界面的性能更加强大。

Windowing System(窗口系统)

  窗口系统是 GUI Shell 引入的一个概念,它是 GUI 的基本架构。以 WIMP (windows、icons、menus、pointer) 的形式,提供人机交互接口。Linux 系统中有很多窗口系统的实现,如 X Window System、Wayland 等,虽然形态各异,但思路大致相同。
在这里插入图片描述

X Window System

  X 窗口系统(X Window System)简称 X 或 X11,是 Windowing System 一种实现,是一个用位图显示的窗口系统,广泛使用于 Unix、类 Unix 操作系统上,由 MIT(Massachusetts Institute of Technology,麻省理工学院)在 1984 年发布。

  X Window System 之所以称作 X 是因为 X Window System 是在 MIT 之前使用的 W Window System 的基础上实现的,他们取了字母表中 W 之后的 X 作为新的名称。之所以称作 X11,X Window System 都是基于 X 的第 11 个版本实现的。

X 及 X11

  在 1984 年 5 月,Scheilfer 将 W 的同步协议换成异步协议,以及将显示列表换成直接模式绘图,而创造出 X 的版本 1。X 是第一个真正的硬件和制造商无关的窗口系统环境。

  X 是一个开放的协议规范,当前版本为 11,俗称 X11。X Window System 的核心就是 X 协议。X 基于 C/S 模型,由客户端和服务端组成,服务端 X Server 负责图形显示,而客户端库 X Client 根据系统设置的 DISPLAY 环境变量,将图形显示请求发送给相应的 X Server。
在这里插入图片描述

  • X 由 X 协议一些软件工具 组成。
  • X 架构包括 X server 和 X client,它们之间通过 X protocol 通信。
  • X server 接收 X clients 的显示请求,并输出到显示设备上,同时,会把输入设备的输入事件,转递给相应的 X client。X server 一般以daemon 进程的形式存在。
  • X protocol 是网络透明(network-transparently)的,也就是说,server 和 client 可以位于同一台机器上的同一个操作系统中,也可以位于不同机器上的不同操作系统中。
  • X 将 protocol 封装为命令原语(X command primitives),以库的形式(xlib 或者 xcb)向 client 提供接口。X client(即应用程序)利用这些 API,可以向 X server 发起2D(或3D,通过GLX等扩展)的绘图请求。

  X 只提供实现 GUI 环境的基本框架,如定义 protocol、在显示设备上绘制基本的图形单元(点、线、面等等)、和鼠标键盘等输入设备交互、等等。它并没有实现 UI 设计所需的 button、menu、window、title-bar、styles 等元素,而是由第三方的应用程序提供。因此,在 Linux 上的桌面环境百花齐放(不统一)。

X 的发展还是很曲折的:

  1. X 最初由 MIT 开发。但是,1987年之后,随着 X11 获取明显成功,需求也越来越多,MIT 已无力来处理 X 协议,因此希望免除 X 的管理责任,于是,一些 MIT 联合一些使用 X 的公司,在 1988 年 1 月,X 协会(X Consortium)做为非营利厂商团体而成立,来维护 X 协议。
  2. 1993 年,X 协会公司(X Consortium, Inc.;非营利性质的公司)做为 MIT X 协会的接继者而成立。它于 1994 年 5 月 16 日发布了X11R6。而原有的 X 协会在发布了最后一个版本的 X11R6.3 后,于 1996 年末解散。
  3. 1997 年中,X Consortium 将 X 的管理交给开放团体,而开放团体是1996 年由开放软件基金会(OSF)和 X/Open 合并成立的厂商团体。开放团体于1998 年首次发布 X11R6.4。1999 年 5 月开放团体组建了 X.Org。X.Org 指导了 X11R6.5.1 之前的版本发布。在此期间 X 的开发死气沉沉。
  4. 在 1989 年至 1990 年期间,基于 X11R6 发展出来了最初专门给 Intel X86 架构 PC 使用的 X,称作 XFree86。而后 XFree86 发展成为几乎适用于所有类 UNIX 操作系统的 X Window 系统,因此在相当长的一段时间里,XFree86 也是 X 的代名词。再后来,从 2004 年的时候,XFree86 不再遵从 GPL 许可证发行,导致许多发行套件不再使用 XFree86,转而使用 Xorg。
  5. 2004 年年初 X.Org 基金会成立。这意味着 X 在管理上的根本转变。1988 年以来 X 的管理者(包括过去的 X.Org)都是厂商组织,而基金会由软件开发者领导,采用依靠外部参与的集市模式的社区开发。在 XFree86 4.4RC2 基础上合并了 X11R6.6 的修改,基金会在 2004 年4 月发布了 X11R6.7。

下图是维基百科整理的 X 的发展版本变更情况:
在这里插入图片描述

Xfree86 和 Xorg

  Xfree86 和 Xorg 是 X 协议(X 协议第 11 版)的软件实现。在1989 年至 1990 年期间,托马斯·罗尔把 X11R4 分类器上提供的 X 服务器程序的源代码下载到运行速度仅为 33MHz 的 386PC 上,成功运行了被他称为是 X38611.1 的 X 服务器。这就是 XFree86 的雏形。

  后来,由于 Xorg 开发缓慢,而 Xfree86 要活跃很多,在一段时间内,Xfree86 就代表了 X,推动着 X 的发展。由于 XFree86 于 2004 年 2 月在更加严格许可证下发布了4.4,许多依赖 X 的项目认为该许可证无法接受,而此时,X.Org 基金会成立并依据 Xfree86 之前的版本重新发布了 Xorg,很多依赖 X 的项目都开始使用 Xorg。

  Xfree86 和 Xorg 都是 Server 端的程序实现,因此也被称为 Xfree86 Server 和 Xorg Server。 Xfree86 核心团队在 2003年已经解散,最后一次代码提交是在 2009 年,该项目于 2011 年被确认处于休眠状态。原来 Xfree86 的许多开发者都转投了 Xorg,目前,Xfree86 已经很少使用,Xorg 成为了主流。

Xlib 和 XCB

  Xlib(也称为 libX11)是一个 X 窗口系统协议客户端库,以 C 编程语言编写。它包含与 X 服务器交互的功能。这些功能允许程序员在不知道协议细节的情况下编写程序。不过,实际很少有应用程序直接使用 Xlib,而是直接使用一些对 Xlib 进一步封装的库。

  • X Toolkit Intrinsics (Xt)
  • Athena widget set (Xaw)
  • Motif
  • FLTK
  • GTK
  • Qt (X11 version)
  • Tk
  • SDL (Simple DirectMedia Layer)
  • SFML (Simple and Fast Multimedia Library)
    在这里插入图片描述
      XCB 是实现 X11 显示服务器协议客户端的库。XCB 以 C 编程语言编写,并以 MIT 许可证分发。该项目由 Bart Massey 于2001 年启动,旨在取代 Xlib。
QT、GTK 等

  QT 和 GTK 等都是一些用于创建图形用户界面(GUI)的自由开源跨平台窗口小部件工具包。他们进一步封装了 X 协议,并且他们提供了更为丰富的窗口及控制机制。如下图是 GTK 的架构展示:
在这里插入图片描述
  随着 Wayland 的逐渐流行,这些窗口工具包也基本都开始支持 Wayland。例如,gtk3 和 gtk4 包已经提供了 Wayland 支持,并且 GTK 会默认使用 Wayland 后端;要在 Qt 5 中启用 Wayland 支持,需要安装 qt5-wayland 软件包。下图是 Wayland 给出的支持情况:
在这里插入图片描述

Wayland

  Wayland 是一个通信协议,规定了显示服务器与其客户机之间的通信方式,而使用这个协议的显示服务器称为 Wayland Compositor。它由 Kristian Høgsberg 于 2008 年发起,目标是用更简单的现代化视窗系统取代 X Window System。Wayland 协议的参考实现称为 Weston,由 Wayland 项目组使用 C 语言开发。

  Wayland 与 X Window System 的最大不同在于,它规定由客户机自身负责窗口边框和装饰的绘制,并且客户机能够通过 EGL以及一些 Wayland 特定的 EGL 扩展组件直接在显示存储器中算绘自己的缓冲器。窗口管理器简化成显示管理服务,专门负责算绘那些屏幕上的程序。这比 X Window System 中的窗口管理器要更简单、高效。
在这里插入图片描述
  Wayland 协议遵循客户端服务器模型,其中客户端是请求在屏幕上显示像素缓冲区的图形应用程序,而服务器(合成器)是控制这些缓冲区显示的服务提供者。

Window Manager

  窗口管理器是在图形用户界面的视窗系统中,控制窗口位置与外观的软件。它是负责管理与定位窗口的移动、最大化、最小化、改变大小以及关闭等工作。简而言之,就是给一个窗口加上最大化,最小化,关闭按钮标题栏和框架。Twm(Tom Window Manager)就是 X.org 提供的简单的窗口管理器。

  大多数窗口管理器被设计用来帮助提供桌面环境。在 20 世纪 70 年代,施乐的 Alto 成为第一款带有 WIMP GUI 的计算机。它使用了一个允许重叠窗口的堆叠窗口管理器。

  在使用 X 窗口系统的系统上,窗口管理器和窗口系统之间有明显的区别。严格地说,X 窗口管理器不直接与视频硬件、鼠标或键盘交互。这些都是由显示服务器负责的。当窗口管理器开始运作时,X 服务器和客户端之间的交互,会重定向到窗口管理器。每当要显示一个新窗口时,这个请求便会被重定向到窗口管理器,它会决定窗口的初始位置。

GNOME、KDE、Xfce

  • KDE,K Desktop Environment
  • GNOME,GNU Network Object Model Environment
  • Xfce,XForms Common Environment

  他们都是窗口管理器,但又不仅仅是窗口管理器,他们比一般的窗口管理器多了很多功能。其中,KDE 是在 QT 基础上实现的窗口管理器;GNOME、Xfce 是在 GTK 基础上实现的窗口管理器。

参考

  1. http://www.4k8k.xyz/article/u011734326/90598788
  2. https://zhuanlan.zhihu.com/p/96153960
  3. http://www.wowotech.net/
  4. https://en.wikipedia.org/wiki/Linux
  5. https://en.wikipedia.org/wiki/Xlib
  6. https://en.wikipedia.org/wiki/Windowing_system
  7. https://en.wikipedia.org/wiki/Architecture_of_Windows_NT
  8. https://en.wikipedia.org/wiki/Shell_(computing)
  9. https://blog.csdn.net/yanggleyang/article/details/104727065
  10. https://www.geeksforgeeks.org/difference-between-terminal-console-shell-and-command-line/
  11. https://www.educba.com/powershell-vs-command-prompt/
GitHub 加速计划 / term / terminal
94.53 K
8.17 K
下载
The new Windows Terminal and the original Windows console host, all in the same place!
最近提交(Master分支:2 个月前 )
d04381ec "HighContrast" is not a possible requested theme. So `_UpdateBackgroundForMica()` would force the settings UI to be light or dark. To fix this, we just check if we're in high contrast mode and, if so, we don't bother setting the requested theme. 8 天前
e83434ff Turns out that having the styles for the KeyChordText and ParsedCommandLineText be empty for high contrast mode caused the issue. Since we're already using theme resources for the colors, we automatically adjust properly to whatever the high contrast theme is (Thanks XAML!). Bonus points: - we didn't need the theme dictionaries anymore, so I just moved them to the ResourceDictionary directly - ParsedCommandLineTextBlockStyle isn't used. So I removed it altogether. Validated command palette with multiple high contrast themes. See PR thread for demo. Closes #17914 8 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐