Linux 之六 Shell、终端(Terminal)、控制台(Console)、CLI 命令行界面、GUI 图形用户界面(X、X11、Xfree86、Xorg、GNOME、KDE)
在使用 Ubuntu 的过程中,我们不可避免的要使用一个名为 Terminal 的东西,也一定会遇到一些叫 X、X11、GNOME、KDE 等等这些名词的东西。今天就总结一下这些玩意到底是啥,以及分别有哪些功能及用途。
架构
在介绍各个名词的具体含义之前,我们先来简单看一下 Linux 系统的整体架构,同时以比较熟悉的 Windows(这里指的是 Windows NT 内核) 架构作为对比,如下图所示:
结合上图中,我们需要了解以下这几点:
- 现在,Linux 这个名称代表了 Linux 系统,Linux Kernel 表示内核。在最初,Linux 本身就是一个内核,只有加上其他一些组件之后才是我们熟悉的真正意义上的系统。后来,随着 Linux 的流行,人们逐渐默认了 Linux 就代指系统。理解这个概念非常重要。
- 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 的发展还是很曲折的:
- X 最初由 MIT 开发。但是,1987年之后,随着 X11 获取明显成功,需求也越来越多,MIT 已无力来处理 X 协议,因此希望免除 X 的管理责任,于是,一些 MIT 联合一些使用 X 的公司,在 1988 年 1 月,X 协会(X Consortium)做为非营利厂商团体而成立,来维护 X 协议。
- 1993 年,X 协会公司(X Consortium, Inc.;非营利性质的公司)做为 MIT X 协会的接继者而成立。它于 1994 年 5 月 16 日发布了X11R6。而原有的 X 协会在发布了最后一个版本的 X11R6.3 后,于 1996 年末解散。
- 1997 年中,X Consortium 将 X 的管理交给开放团体,而开放团体是1996 年由开放软件基金会(OSF)和 X/Open 合并成立的厂商团体。开放团体于1998 年首次发布 X11R6.4。1999 年 5 月开放团体组建了 X.Org。X.Org 指导了 X11R6.5.1 之前的版本发布。在此期间 X 的开发死气沉沉。
- 在 1989 年至 1990 年期间,基于 X11R6 发展出来了最初专门给 Intel X86 架构 PC 使用的 X,称作 XFree86。而后 XFree86 发展成为几乎适用于所有类 UNIX 操作系统的 X Window 系统,因此在相当长的一段时间里,XFree86 也是 X 的代名词。再后来,从 2004 年的时候,XFree86 不再遵从 GPL 许可证发行,导致许多发行套件不再使用 XFree86,转而使用 Xorg。
- 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 基础上实现的窗口管理器。
参考
- http://www.4k8k.xyz/article/u011734326/90598788
- https://zhuanlan.zhihu.com/p/96153960
- http://www.wowotech.net/
- https://en.wikipedia.org/wiki/Linux
- https://en.wikipedia.org/wiki/Xlib
- https://en.wikipedia.org/wiki/Windowing_system
- https://en.wikipedia.org/wiki/Architecture_of_Windows_NT
- https://en.wikipedia.org/wiki/Shell_(computing)
- https://blog.csdn.net/yanggleyang/article/details/104727065
- https://www.geeksforgeeks.org/difference-between-terminal-console-shell-and-command-line/
- https://www.educba.com/powershell-vs-command-prompt/
更多推荐
所有评论(0)