terminal、shell 和 tty 的区别

Travis2024/02/08
898 字, 阅读需要 5 分钟

我第一次接触 Linux,是在 CSAPP 课程上,当时老师下发 Ubuntu 的镜像,用保姆级教程手把手教我们在 vmware 上搭建一个 Ubuntu 虚拟机 (现在看信手拈来,但当时废了好大的功夫)。

对于当时的我来说,对 Linux 的全部理解就是:打开 Terminal,然后里面自然而然的就会蹦出 bash 的交互界面,我只要输入一些现成的命令就能让系统做我想做的事情了。 随着理解的加深,我逐渐了解到了我打开的 Terminal 的全称应该是终端模拟器,shell 不只有 bash,还有 zsh、fish 等等,我输入的指令有些是 shell 提供的,大部分只是放在 $PATH 路径下的一些二进制文件罢了。

但是我一直没有真正搞清楚,terminal、shell、tty、console 这些名词究竟代表了什么。 恰好最近在 Hacker News 上看到了 这篇帖子,这次就下定决心一探究竟吧。

首先查查维基百科:

  • tty 代表的是 TeleTypewriter 1,也就是电传打字机。
  • shell 2 则是提供用户界面的软件
  • terminal 则在维基页面中列出了两种
    • Terminal emulator (or terminal application),是一种模拟视屏终端的软件
    • Computer terminal,其中提到了 tty 3

在计算机诞生的早期,需要终端来将数据输入计算机,再到后来的分时系统,一台计算机连接多个终端以供使用。而电传打字机,除了能连接到计算机,这种打字机功能和在电视剧当中能见到的老式打字机类似,下面是键盘,上面是一个纸卷的容纳仓。给出指令后,输出就会从纸上一行行打印出来。

现在,我们都不再使用早期的终端,但是我们的电脑上依然存在这种软件,例如 MacOS 上自带的 Terminal,Windows 上的 Windows Terminal,还有诸如 KittyAlacritty,它们都被叫做终端模拟器(Terminal Emulator)。 终端模拟器负责处理我们的输入并且将输出渲染出来,简单的指令例如 cat $FILE,能够输出该文件的内容,更复杂的交互式进程例如 vim,则能输出编辑界面。

终端模拟器并没有直接和 shell 打交道,它们之间隔了一层 tty(或 pty),tty 能够很好的解耦 shell 和输入输出之间的关系。对于不同的设备,输入输出的处理方式不尽相同。下面是一张 ASCII 示意图 4

//===========================\\
||          Terminal         ||
||             |-----------| ||
|| Keyboard--->|   Input   |-++->|---|   |-------|
||             |-----------| ||  |tty|<=>| shell |
||         |---------|<------++--|---|   |-------|
|| Print<--|  Output |       ||
||         |---------|       ||
||                           ||
\\===========================//

到了 shell 这一层,就进入我们熟知的软件了。shell 能够通过我们的输入和特殊的转义字符,完成特定的操作。例如 bash 中的 Ctrl-eCtrl-a 是将光标跳转到行尾和行首,Ctrl-uCtrl-k 则是删除光标前和光标后的所有字符。 同时 shell 也会对输出做一些手脚,例如输出的各种颜色,其中用的是一堆转义符,shell 理解了之后才会为文本着色。

总结

terminal 是古早的终端设备,现在一般指代终端模拟器这一软件;tty 则是 Unix/Linux 系统中的设备,是连接终端和 shell 的桥梁;shell 则是解释我们输入的命令的软件。

脚注

  1. "What does"TTY"stand for?". Ask Ubuntu.

  2. Shell (computing)

  3. Hard-copy terminal

  4. What is the exact difference between a 'terminal', a'shell', a 'tty' and a 'console'?

© LICENSED UNDER CC BY-NC-SA 4.0