控制台、终端、终端仿真器、命令行和 Shell 之间到底有什么区别?
控制台、终端、终端仿真器、命令行和 Shell 之间到底有什么区别?
编程是一门掌握大量相互关联的小概念的艺术。命令行就是其中之一。不幸的是,进入命令行的旅程往往始于令人困惑的术语。经过多年的编程,我发现自己对控制台(Console)、终端(Terminal)、终端仿真器(Terminal Emulator)、命令行(Command Line)和 Shell 之间的区别知之甚少。雪上加霜的是,这些术语经常被人们和组织错误地使用,从而加剧了混乱。本博文旨在成为你最后一篇需要阅读的博文。此外,它还旨在让你对命令行的工作原理有一个基础性的了解。不过,这并不是一本如何使用这些工具的指南。这篇文章的重点是术语。但请相信我……在了解命令行术语后,你就能更好地掌握命令行。
#记忆之旅
在谈论命令行及其术语时,我们很快就会聊到更广泛的 Linux。事实上,你可以在《Linux 命令行》(The Linux Command Line)等书中找到本篇博文的许多信息。不过,围绕命令行的许多术语都早于 Linux。它甚至早于许多 Linux/GNU 发行版所基于的操作系统–Unix。要理解这些术语,我们必须回到计算机发展的早期。
这是一个带有显示屏和键盘的单一终端。事实上,它并不是一台计算机。相反,它与附近一台大得多的计算机相连。使用时,它以一个简单的文本界面迎接用户:命令提示符。没有鼠标,也没有图形用户界面(GUI)让你点击文件夹、打开图像或播放歌曲。事实上,在图形用户界面出现之前,计算机就已经做得很好了。它们使用磁带和打孔卡作为输入/输出流,处理数十亿份报税表、选举结果和银行账户。
终端 Terminal
如果你刚才有留意,你可能已经注意到我把输入设备称为终端,而不是计算机。我这样做是因为该设备不具备计算功能。它的唯一用途就是接受用户输入。
终端机是人与计算机之间的接口。这符合终端一词的字面意思。终端是事物的终点。例如,上下飞机的地方就叫终点站。由于终端和计算机是两种截然不同的设备,因此使用一个单独的词也是合情合理的。
终端的一种特定迭代(如第一张图片所示)被称为控制台。控制台通常是一种将屏幕和键盘(不是计算机)结合在一起的设备/终端。你可以在控制台的键盘上输入命令,然后接收控制台屏幕上显示的输出。
如今,我们的设置看起来有所不同。我们借助键盘、鼠标、触控板、麦克风等设备向计算机输入命令。我们可以将所有这些设备统称为终端。这听起来可能令人困惑,因为我们习惯在不同的语境中听到终端这个词。如果你是 macOS 或 Linux 用户,很可能预装了一个名为 Terminal 的应用程序。不过,这个程序并不是终端: 它是一个名为 “终端模拟器 Terminal Emulator”的程序。时至今日,将终端仿真器程序称为终端仍会引起很多混淆。
在深入了解终端模拟器之前,让我们先喘口气,回顾一下。
回顾
我们了解到,早期的计算机没有图形用户界面。要与计算机交互,你需要在键盘(终端)上输入命令。要查看计算结果,则需要阅读屏幕(也是终端)。如果有一种特定类型的终端将屏幕和键盘结合在一起,那么这种终端就是控制台。JavaScript 中的命令 console.log 其实很好命名。把它命名为 terminal.log 会更糟,因为终端不仅是屏幕这样的输出设备,也是键盘和鼠标这样的输入设备。通过命名 console.log,我们可以假定记录日志的设备有屏幕。不过,在一些细微之处,这种命名方式似乎并不理想。例如,当我们在服务器上调用 console.log 时,我们实际上不是向控制台记录日志,而是向日志文件记录日志。日志文件不是控制台。
终端仿真器
不说过去了。让我们快进到今天。当我们启动现代电脑时,映入眼帘的是漂亮的图形用户界面。我们无需学习复杂的文本命令,只需点击即可。这种便利帮助许多人操作电脑。然而,在操作系统的引擎盖下,仍然存在接受基于文本命令的程序。要与接受文本命令作为输入的程序(称为shell)进行交互,我们需要使用iTerm、GNOME Terminal或 latelyWarp等终端模拟器。如上所述,终端模拟器是一种图形用户界面应用程序,可以在桌面的窗口中模拟传统终端的功能。重要的是要明白,终端和终端模拟器一样,并不执行任何操作。它们的作用是向 shell 传递基于文本的命令。不同的终端模拟器可能会提供自动完成、分屏和搜索等便利功能。但它们无法改变 shell 或操作系统的基本工作原理。
shell/命令行
shell 之所以得名,是因为它传统上是操作系统的最外层。由于 shell 通常被定义为命令行解释器,因此 shell 与命令行一词同义。命令行解释器是指从终端仿真器读取用户命令并执行这些命令的程序。shell 将人类可读的命令转化为计算机可以执行的操作。shell 和其他程序一样。它使用操作系统的 API 来执行任务,就像其他程序一样。它可以像其他程序一样启动、停止和管理。由于它只是一个程序,因此很容易被替换。作为用户,你可以选择使用操作系统预装的 shell 或安装第三方 shell(如zsh)。几乎所有的 Linux 发行版都提供一个来自 GNU 项目的 shell 程序,名为bash。
再次总结
尽管控制台(console)、终端(terminal)、终端仿真器(terminal emulator)、命令行和 shell 看起来可以互换,但每个术语都定义了计算机领域中的一个特定概念。看完这篇博文后,当在工作中被问到这些问题时,你应该有能力做出以下思维替换:
“你用的是什么终端?”
心理替代: “你用哪个终端模拟器访问 shell?”
“你最喜欢哪个 shell?”
心理替代: “你用什么程序在电脑上解释和执行基于文本的命令?”
“你为什么不用 iTerm?”
心理替代: “你应该使用另一个程序将基于文本的命令传递给 shell 程序。”
“你为什么不用 z-shell?”
心理替代: “我相信使用不同的程序来解释和执行基于文本的命令会对你有帮助。”
“控制台记录了什么?”
心理替代: “在执行 shell 命令时,终端模拟器窗口打印了什么?”