terminal、shell、tty 和 console 傻傻分不清楚

Feb 16, 2019 11:00 · 1038 words · 3 minute read Shell UNIX Linux

terminal(终端)字面意义是一根电线的末端,而 shell(壳)是乌龟的家,tty 看上去就不是什么正经单词,console 则是一种柜子吧。

实际上,在 UNIX 术语中:

  • terminal = tty = text input/output environment(文本输入/输出环境)
  • console = 物理终端
  • shell = 命令行解释器

console、terminal 和 tty 三者密切相关。开始,它们代表了一类可以与计算机进行交互的设备:在早期的 UNIX 中,意味着像打字机一样的设备,有时候被称为 teletypewriter,缩写就是 tty。而 terminal 这个名字来自电子学的视角,呃,console 则来源于家具。UNIX 历史前期,键盘和显示器成为了终端的标准。

在 UNIX 术语中,tty 是一种特定的设备文件,实现了除读写外的额外的命令。在它最常见的含义中,terminal 等同于 tty。一些 tty 由代表硬件设备的内核提供,输入来自键盘,输出来自文本模式的屏幕。其他的,有时被称作伪 tty,由名为终端仿真器的程序提供,比如 Xterm(X Window 系统上运行),Screen(为程序和另一个终端之间提供了一层隔离),ssh(将一台机器上的终端与另一台机器上的程序连接起来)等等。

terminal 这个单词也具有更传统的含义,人们通过它可以使用键盘和显示器与计算机交互。举个例子 X terminal 是一种 thin client,是一种专用的计算机,其唯一目的是驱动键盘、显示器、鼠标这些和人类交互的外围设备,真正的应用程序在一台更强大的计算机上运行。

console 通常是物理意义上的终端,可以定义为直接连接到机器的主要终端。console 在操作系统中显示为(内核实现的) tty。像 Linux 和 FreeBSD,console 看起来是好几种 tty,给每个特定的 tty 可能是“控制台”、“虚拟控制台”、“虚拟终端”或者其他变体。

shell 是用户登录时看到的主界面,用来启动其他应用程序。

在 UNIX 圈子中,shell 专门用于表示命令行 shell,以输入想要启动的应用程序名,后面跟随想要操作的文件或其他对象的名称,按下 Enter 键。其他非 UNIX 的环境不用 shell 这个词;基于视窗界面的操作系统使用“窗口管理器”和“桌面环境”而不是 shell。

有很多种不同的 UNIX shell。常见的包括 bash(大多数 Linux 预装)、zsh(强大且可随心定制)、fish(更强调简洁)。

命令行 shell 包括用于组合命令的流控制结构。除了在交互式提示符下键入命令外,用户还可以编写脚本。最常见的 shell 都有基于 Bourne shell 的通用语法。说到 shell 编程时,这里的 shell 一般都是 Bourne 风格的。几乎任何类 UNIX 的系统都有一个 Bourne 风格的 shell 安装在 /bin/sh,通常是 ash、ksh 或者 bash。