在使用 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/

Linux 之六 Shell、终端(Terminal)、控制台(Console)、CLI 命令行界面、GUI 图形用户界面(X、X11、Xfree86、Xorg、GNOME、KDE)相关推荐

  1. linux emacs命令,Linux Bash Shell 终端 Terminal Emacs 模式 常用 快捷键 命令

    背景: OS:Ubuntu 16.04 Bash 的编辑模式:Emacs 模式 本文介绍的快捷键 仅当 您的 Bash 的编辑模式 为 Emacs 模式 时 有效,Bash 默认的编辑模式为 Emac ...

  2. 八、Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程(中)

    @Author : Runsen @Date:2020/9/11 文章是Runsen在Gitchat付费文章分享:Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程 顺便同步到C ...

  3. Linux的shell终端常用快捷键大全

    在日常工作中,许多事情要经常与电脑打交道,特别是高频率地使用一些专业性的软件,或者是玩一些键盘流性质的游戏,就应该熟知常用的快捷键,这样玩起来不仅高效,而且略显专业性. 对于某些IT工作者来说,Lin ...

  4. 七、Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程(上)

    @Author : Runsen @Date:2020/9/11 文章是Gitchat付费文章分享:Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程 顺便同步到CSDN中,这里 ...

  5. linux 终端发出哔声,关闭Linux下Shell终端嘟嘟声和vi中错误提醒的Beep音(zz)

    很有用的东西 Q. This beep sound is annoying under Linux, how do I disable it forever? A. To be frank there ...

  6. Linux图形系统框架 与 X协议 X11 XFree86 Xorg X-Window WM

    文章目录 前言 GUI(Graphical User Interface) Windowing system(窗口系统) X Window System 窗口管理器.GUI工具集.桌面环境及其它 3D ...

  7. linux(ubuntu)~终端(terminal)shell操作指令

    shell是指计算机操作指令,是用户.计算机程序.内核之间沟通的桥梁,是计算机图形化之前操作计算机的方式,现在包含:sh-shell.bash-shell.csh-shell.tcsh-shell.a ...

  8. Linux中的终端、控制台、tty、pty等概念

    基本概念: 1>tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东 ...

  9. linux怎么把字体变成彩色的,Linux/UNIX下终端和控制台彩色字体的实现

    刚刚复试完,不出以外的话可以上班了,希望能获得自己喜欢的工作.同时更新两篇小技巧. 一个小技巧,shell编程中不用也可以,但是用了之后会有异常醒目的效果,可以用来显示成功.失败或者是警告等关键信息. ...

  10. Linux在shell终端中清空DNS缓存,刷新DNS的方法(ubuntu,debian)

    前言 在Linux系统里查询DNS使用如下命令 dig baidu.com @114.114.114.114 或者使用系统默认的DNS服务器查询 nslookup baidu.com 下文中的方法不一 ...

最新文章

  1. html搜狐热搜列表仿写,GRE高分范文不能看过就算 学会仿写才能带来真正提高
  2. 【物联网云端对接-1】 通过HTTP协议与微软Azure IoT hub进行云端通信
  3. java开发环境搭建(重点)
  4. 设计模式之装饰模式的学习
  5. 计算机视觉论文-2021-06-17
  6. 四川教育考试网全国计算机,四川教育考试院
  7. 【note】软件体系结构(6-10章)
  8. android 自定义 黑点,Android自定义密码样式 黑点转换成特殊字符
  9. 图解 Paxos 算法
  10. 图像处理之前景检测(三)之码本(codebook)(主要为代码升级)
  11. 外包一个小程序多少钱(外包小程序开发的价格费用)
  12. 盘点软件开发中那些有趣的边际效应
  13. 梦想贵在坚持 第一周(1.9-1.15)
  14. java下载m3u8转ts合成mp4
  15. 环境配置之Keepass
  16. Handlebars.js使用介绍
  17. JAVA中的集合的概念
  18. 二维拉普拉斯方程的极坐标形式
  19. 快速傅氏变换之旅(五) 嵌入式中的FFT(最好选择DSP或FPGA)
  20. 使用Docker Swarm,Docker Compose和Consul扩展到无限(第3/4部分)–蓝绿色部署,自动化和自我修复过程...

热门文章

  1. 实战PyQt5: 137-QChart图表之散点图
  2. 移动机械硬盘测试软件,硬盘检测工具HDTune使用教程
  3. 社区之星任玉刚:Android开发者的职场规划
  4. 基于SpringBoot的救援物资管理系统
  5. java saxreader 生成xml_SAXReader解析xml文件demo
  6. ubuntu1804下txt文件乱码问题
  7. 初级网优工程师需要符合什么标准?华为初级认证重点知识!
  8. 算法解析——矩阵快速幂
  9. C语言开发环境搭建过程
  10. 区块链ppt_朱嘉明最新演讲:区块链很可能带来科学领域的范式革命(附PPT)