Linux 控制台、终端及 Shell

徐小东

2023-01-03

在谈及 Linux 命令行时,有时会遇到控制台、终端、终端模拟器、以及 Shell 这几个基本概念。有些朋友往往傻傻分不清楚,下面就来做个一一介绍。

控制台

控制台(Console),又称为系统控制台(System console)、计算机控制台(Computer console)、根控制台(Root console)、以及操作员控制台(Operator’s console)。事实上,早先的控制台是一种用来操作计算机的硬件,如图所示。1 https://en.wikipedia.org/wiki/System_console#/media/File:IBM_1620_Model_1.jpg从这幅图片中,我们可以看到 IBM 1620 计算机的控制台由左边的操作前面板和右边的打字机组成。通过控制台,操作员将文本数据或待执行的指令录入到计算机,并最终通过计算机读取或执行。

IBM 1620 的控制台

IBM 1620 的控制台

IBM 1620 控制台的操作前面板

IBM 1620 控制台的操作前面板

随着计算机的发展,控制台从硬件概念变成了一个软件概念。于是,控制台有了新的称呼:虚拟控制台。虚拟控制台正好与物理的控制台硬件相对。通过观察 Linux 系统的启动过程,我们不难发现:在经过计算机硬件自检之后,一旦由引导载入程序接管,不一会儿便会进入系统控制台。在这个过程中,通常会显示如图所示的 Linux 系统引导信息。2 https://en.wikipedia.org/wiki/Linux_console#/media/File:Knoppix-3.8-boot.png

Linux 系统虚拟控制台

Linux 系统虚拟控制台

终端

跟控制台一样,起初的终端(Terminal)也是一种计算机硬件设备。从外形上看,终端类似于我们今天所看到的显示器和键盘的结合体。通过终端,用户将指令和数据输入到计算机。同时,终端也将计算机执行的结果展示给用户。图中显示的是曾经广为流行的终端 DEC VT100。3 https://en.wikipedia.org/wiki/Computer_terminal#/media/File:DEC_VT100_terminal.jpg

DEC VT100 终端

DEC VT100 终端

或许你会产生疑问,为什么会出现终端这种硬件设备呢?以今天的眼光来看,显得似乎有些难以理解。诞生之初的计算机造价相当昂贵,可不像现在人人都能拥有一台那么简单。除了大型商业组织或大学研究机构,很难在别处看到计算机的身影。为了能够共享计算机资源,终端应运而生。然而,伴随着科技的进步,终端最终掉进了历史的黑洞。不过,它后来却以新的形式重生,这就是终端模拟器(Terminal emulator),或称之为虚拟终端。

终端模拟器

终端模拟器,即用来模拟终端硬件设备的应用程序。在物理终端中存在的某些显示体系结构,比如用来控制色彩的转义序列、光标位置等在终端模拟器中也得到了支持。下图显示 Linux 中流行的终端程序之一 XTerm。

XTerm 终端模拟器

XTerm 终端模拟器

不管是 Linux 操作系统,还是 macOS 操作系统,乃至 Windows 操作系统,今天都有许多终端模拟器可以选择。以下罗列的是这三个操作系统中比较流行的终端模拟器。

Linux

macOS

Windows

Shell

Shell 是一种命令解释程序,它负责用户输入命令的读取、解析和执行。现代 Shell 除了具有与用户直接交互的特性之外,通常也包含编程功能,支持变量、数组、函数、循环、条件等编程基本要素。

Shell 之所以如此称呼,是由于它相对 Unix 及 Linux 的核心——内核(Kernel)而言,处于整个操作系统的最外层,就像乌龟的壳一样。也正因为如此,Shell 提供用来访问系统服务的用户界面,扮演着与内核交互的角色,如图所示。

Shell 与内核

Shell 与内核

在 Unix 及 Linux 的发展过程中,出现了许多种 Shell,其中比较知名的包括:sh、csh、ksh、bash、zsh 等等。

sh

sh,即 Bourne shell,它是 Unix 第 7 版的默认 Shell。Bourne shell 由贝尔实验室的 Stephen Bourne 开发,于 1979 年发布。随着《Unix 编程环境》(Brian Kernighan 与 Rob Pike 著)一书的出版,sh 变得大为流行。

Bourne shell 早已被后来的 Shell 所取代,现代 Linux 系统中的 sh 通常是符号链接的某个兼容 Shell。例如,所用的 Debian 里的 sh 为 dash。

root@toydroid:~# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jan 24  2017 /bin/sh -> dash

而在另一个系统 Arch Linux 上,sh 则为 bash。

root@codeland:~# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb  7 15:15 /bin/sh -> bash

csh

csh 是 C shell 的简称,它由 Bill Joy 开发,通过 BSD 得到了广泛的分发。在风格上,开发者将 csh 设计得像 C 编程语言一样,因而由此得名。同时,csh 具有很不错的交互使用体验。后来被其它 Shell 所吸收的诸如历史、别名、目录栈、文件名补全、作业控制等特性均出自 csh。

csh 有一个改进版本叫 tcsh,目前是 FreeBSD 的默认 Shell。

ksh

ksh 指 Korn Shell,其开发者为 David Korn,在 1983 年公布于世。ksh 遵循 POSIX 标准,能够向下兼容 Bourne shell,整合了来自 C shell 的诸多特性。ksh 的一大亮点是引入了 vi 和 Emacs 风格的命令行编辑模式,使用户完全可以按照自己的按键习惯操作。此外,在 ksh 中还增加了关联数组的特性。

由于 ksh 最初以私有软件的形式进行分发,从而被限制了传播。代之以出现的替代品包括 pdksh(public domain ksh,公有域的 ksh)、mksh(后成为 Android 的默认 Shell)等。

bash

bash 作为理查德·斯托曼 GNU 工程的一部分出现,从它诞生之初就是为了用来取代 Bourne shell。Brian Fox 开发了最初的 bash,首个版本发布于 1989 年。如今,bash 已变得十分流行,它是大多数 Linux 发行版以及 macOS 的默认 Shell。此外,通过 WSL(Windows Subsystem for Linux),在 Windows 10 中也可以安装并使用 bash。

bash 的名称来自于 Bourne-again shell,它也遵循 POSIX 标准,其特性吸收自 sh、csh、ksh 等多种 Shell。

zsh

zsh 是 Z shell 的简称,最初的版本由 Paul Falstad 所开发,发布于 1990 年。zsh 极大的扩展了 Bourne shell 的功能,并包含来自 tcsh、ksh、bash 等 Shell 的特性。

在交互用户体验上,zsh 尤其出彩。比如,它支持对命令的选项进行补全、可以设置右提示符等,如图所示。

zsh 的右提示符

zsh 的右提示符