Linux控制台、终端、Shell 的历史

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系!

①微思网络,始于2002年!专注IT认证培训22年。
② 领取学习资料/课程咨询:+小美老师(wx):18106083689 ,加好友即送学习大礼包,邀请您加入IT精英学习群(每天分享技术文档、行业资讯,免费公开课)。
③ 微思有哪些培训及考证?
网络方向(华为认证HCIA/HCIP/HCIE;思科认证);Linux(红帽RHCE/RHCA);K8S&容器(CKA/CKS);数据库(ORACLE OCP/OCM;MySQL);虚拟化( VMware VCP/VCAP);热门安全认证(CISP体系/CISSP/ CISA/CCSK/CISAW);管理类(PMP 项目管理;软考中/高项;ITIL体系;Togaf)等等
④ 循环开班,面授班&直播班,免费重听,学会为止! 

大多数系统管理员都知道在终端上(Terminal)打开虚拟 Shell(Virtual shell),然后通过 Bash 登录到远程主机上。

或许,可以了解了解它们的历史。

从电报到视频终端

互联网的发展并非仅源于 20 世纪 70 年代的军事项目。从历史的角度来看,人类一直面临着如何进行长距离信息传输的挑战。各种不同的文化尝试了多种方法,包括使用烟雾信号、信鸽,甚至鼓声。

某些森林地区的文化,例如非洲的部落,将鼓声用作早期的远程通信工具。

引用:
https://en.wikipedia.org/wiki/Drums_in_communicatio

在持续的创新和发展过程中,电报的发明被认为是最重要的里程碑之一。

理解 Unix/Linux 终端是如何将一系列独特的概念集成在一起的,我们首先需要从电报的历史开始。

电报 Telegraph

电报的历史可以追溯到 17 世纪和 18 世纪,那时已经有了长距离电报通信的方法。然而,在 18 世纪,尤其是在法国大革命期间,电报技术取得了重大进步。

由于当时法国政治局势动荡,面临着君主制的不稳定,因此人们急需改进电报技术以提高信息传输的效率。所以,电报技术首先在法国得到了广泛应用,然后逐渐在欧洲其他地方推广开来。

要发送电报,你需要在线路的每一侧(发送 emission 和接收 reception)都有两个操作员(operators)。

在当时,无法以纯文本形式发送消息,所以操作员必须对它们进行编码(encode);例如著名的摩尔斯电码系统(Morse system),但不仅如此。

假设你在柏林,你想要向在巴黎的好友发送一份电报。你需要前往柏林的电报办公室,并将你的信息(以纯文本形式)交给那里的操作员。随后这位操作员会对其进行编码并发送到巴黎。在那里,第二个操作员会解码你的信息,将其写在某个地方,并将其交给你的好友。

在 18 和 19 世纪,人们发明了许多类型的电报。最著名的是电电报,但还有许多其他的变种(例如光电报 optical telegram、日光反射电报 Heliograph),这最终导致了电话的发明。

电传打字机 Teleprinter、Teletype、TTY

随着几十年的发展,全球电报流量逐渐增加,对能够编码和解码信息的训练有素的操作员的需求也越来越大。

许多人开始思考如何自动化整个过程的解决方案,最终促成了电传打字机的发明。

电传打字机是一个由键盘和打印机组成的物理设备。使用电传打字机,你可以输入纯文本消息,然后它将自动编码并发送。在另一端,电传打字机可以自动解码消息并打印出来。

随着电传打字机的采用,摩尔斯电码系统不再是发送消息的最佳编码方式,因为它对机器并不友好。

取而代之的是"博多码 Baudot code":每个字符都有相同的长度,使得电传打字机更容易处理。

冷知识
Baudot 码是"波特率(baud rate)" 这个术语的由来,波特率是用于度量数据传输速度的单位。在 Baudot 码中,每个字符的传输速度是一个"波特"

除此之外,它还可以编码更多的字符!五位二进制代码序列,允许在消息中使用32(2^5)个可能的字符。

更好的是:一个 "切换 Shift" 键(或 FIGS,代表"数字切换 figure shift")首次允许在消息中使用数字和特殊字符。

Baudot 编码还包含了一些早期的控制字符(CR,control characters)。

例如,假设你想发送一条消息,但你打错了字:你可以使用 "DEL" 代码表示你想删除它之前的字符。当消息被接收时,负责打印消息的电传打字机不会打印 "DEL" 代码,而是跳过它之前的字符。

这就是为什么控制字符也被称为不可打印字符(non-printable characters)

在1925年,Baudot 码得到了改进,成为了 Murray 码(默里码)。这个新的编码中包含了更多的控制字符,比如回车字符(CR),它可以将打字机的 "光标" 移回同一行的左边界。

当按下回车键时,打字机的 "光标" 会返回到同一行的起始位置,类似于现代终端中 CTRL-A 快捷键。这和我们通常理解的换行(即在文本中开始新的一行,用于将打印位置移动到下一行的同一列)是有区别的。

在编码中,换行通常由另一个控制字符,换行符(LF,Line Feed)来表示。而这些控制字符,今天我们依旧在使用。

时间快进到 1930 年初:一个由电传打字机组成的网络在欧洲(更具体地说是在德国)被发明出来:电传(telex)。

AT&T 在 1931 年在美国推出了其自己的版本。这是当时发送长途电报的最便宜的方式。网络的速度以波特(baud)为单位测量;在欧洲,它的速度是每分钟 50 波特,约等于每分钟 66 个单词。

你可能想不到:在现代 Linux 命令行上,你仍然可以在终端上显示以波特为单位的速度。运行 stty 命令即可。

[root@host ~]# stty
speed 38400 baud; line = 0;
-brkint -imaxbel iutf8

虽然这已经没有什么实际意义,但它却揭示了终端(terminal)源于电传打字机的历史根源。

1961年,美国标准协会创建了一种新的电传打字机编码,称为 ASCII 代码。

它是一个 7 位代码,可以发送比 Baudot(或 Murray)编码更大的消息,甚至包括大小写字母。

这是朝着标准化的一大步。在当时,许多不同的编码仍被用来混合传递消息,有了ASCII代码,美国的电传打字机开始使用相同的字符集来发送消息。

但控制字符本身并没有统一的标准化。两个不同的电传打字机可以使用不同的字符来表示相同的控制。

电报的使用在 1920 年就开始减少,主要原因是电话的普及。据估计,在电报的全盛时期,全球发送的电报数量达到了大约 2 亿条!直到90年代互联网出现,许多记者们依旧还在使用电报。

📌最后你需要知道的事

  电传打字机(teleprinter)是这种设备的官方名称。Teletype 是生产电传打字机的主要品牌,这就是为什么 "Teletype" 成为 "teleprinter" 的同义词。Teletype 的缩写是 TTY

TTY

在 20 世纪 50 年代中期,已经有大量的计算机投入使用。这些主要是由 IBM 制造的大型机,它们占据了大量的空间。

考虑到那个时期电传打字机已经遍及全球,因此将它们用作向计算机发送消息的设备是顺理成章的。

当时的计算机主要是批处理计算机(batch computers),还有一种是交互式计算机,如果要在批处理计算机上同时运行一组程序,你需要进行以下步骤:

1. 使用电传打字机在打孔卡(punch cards)上输入你的代码

2. 将这些打孔卡作为输入,送入计算机中

3. 计算机将运行结果输出到打孔卡上

4. 将输出结果插入制表机中,以人类可读的格式解码

交互式计算机的兴起改变了这种工作流程。你可以直接使用电传打字机将输入发送给计算机。更具体地说,你只需要:

在一台电传打字机上输入你的信息,它会打印在纸上,让你可以看到自己所打的字。电传打字机也将字符(包括控制字符)发送给计算机,计算机将输出发送回电传打字机,同时也打印在纸上(或打孔卡片上)。

这些电传打字机通过串口与计算机连接。这需要两根电线:一根用于将数据发送给计算机,另一根用于接收数据

ASR-33(于1963年推出)是当时广泛使用的电传打字机。它是最早采用ASCII标准的电传打字机之一。

正如我们所见,存在一些控制字符(control characters)能够执行一些 "不可打印 non-printable" 的操作。

现在,在电传打字机与计算机进行交互的情况下,用户需要更多的控制字符。

ASCII 引入了 ESC 键,并创造了 "控制序列 control sequences"。操作不再依赖单个键,而是依赖一系列按键,通常以 ESC 字符为前缀。这就是为什么控制序列也被称为转义序列(escape sequences)。然而,这个前缀并非一个标准,但被广泛采用。

有趣的是,最初的交互式计算机只允许一个用户连接并与之交互

1959年,time-sharing 的发展(时间共享,分时计算机)实现了多程序运行(multiprogramming)。

再后来,时间共享的概念发生了转变:多个用户可以同时与一台计算机进行交互。这就是命令行界面(command-line interface)的起源:一种仅支持文本的界面,允许用户与计算机进行通信。所有的内容都是以打印的形式呈现,包括输入和输出

此时,人们在想,如果用屏幕代替打孔卡或纸张呢?

视频终端 Video Terminals

1960 年,IBM 开始尝试一种与计算机交互的新方式,即 "glass teletype",一种带屏幕的视频终端诞生了。

它类似于电传打字机,但视频终端不会像电传打字机那样打印输入和输出(这种方式速度慢,而且由于电传打字机的机械性质,声音相当大),而是在玻璃屏幕上显示所有内容。

这个视频终端仍然是计算机本身的外部设备,包括屏幕和键盘。像大多数发明一样,一开始它非常昂贵,很少人用得起它。70年代中期,价格下降了,视频终端的成功也随之崛起。

视频终端也被称为"控制台"或简称为"终端",简而言之,你看到的屏幕,就叫做控制台或终端

DEC VT100(上图的视频终端)是最受欢迎的选择之一。它于1978年发布,是最早支持一套新的转义序列ANSI 转义码的视频终端之一。

当视频终端连接到计算机时,该终端被称为"控制终端 controlling terminal",因为它控制着计算机(现在已经不这么称呼了,当年的小插曲)

Unix 系统

现在我们有视频终端可以在小型计算机上使用,那么 70 年代的程序员是如何使用它们的?

1970年,Dennis Ritchie 和 Ken Thompson 在当时流行的 DEC PDP-11 系列迷你计算机上开发了 Unix 操作系统。

顺带一提,Unix 是所有操作系统的开山鼻祖!

在 Unix 中,几乎所有的东西都以文件的形式表示。

外部设备也不例外:当你将一台电传打字机(或视频终端)连接到运行 Unix 的机器上时,它会用以 tty 为前缀的文件来表示该设备。这个文件是外部终端和计算机之间的接口。

在多用户环境中,如果有三个电传打字机连接到计算机,计算机将把文件 /dev/tty0 分配给第一个, /dev/tty1 分配给第二个, /dev/tty2 分配给第三个。而 /dev/tty 始终代表当前终端。

现在我们可以通过这些外部设备向计算机发送命令。但是计算机如何知道如何处理这些命令呢?

有请 shell 出场。

Shell

当你深入思考后,你会发现电传打字机和视频终端的功能相当基础:

  • 它接收你的输入,并将其显示出来。

  • 它将输入传递给计算机。

  • 计算机上运行的某个程序解释输入,并发送回输出。

  • 它将输出显示给你。

但是,我们在这里谈论的某个程序是什么程序?什么可以解析我们的命令?

这个程序就是 shell 。

你在视频终端上输入 ls ,然后通过按下控制字符回车键(现代键盘上的 Enter 键)将其发送到计算机。运行在计算机上的 shell 接收到命令,解释并理解你想要执行程序 ls 。

作为结果,它可能会向内核发送一些系统调用,创建一个新的进程 ls (进程只是一个正在执行的程序),并将该进程的输出发送回终端以显示出来。

此外,shell 还可以解释一个由文本描述的命令列表,称之为 shell script。

终端仿真 Terminal Emulators

随着时间的推移,随着类似 Unix 这样的操作系统的发展,视频终端开始被抽象化。

随着计算机越来越小且便宜,越来越多的"个人"电脑出现了。(第一台被广泛采用的微型计算机是1977年的Apple II),为什么还需要一个物理外部设备,是否可以通过软件来模拟呢

当我们现在谈论终端时,我们通常指的是一个允许我们编写命令的软件。这个终端实际上是一种仿真,试图以软件形式重现视频终端。这就是为什么我们称之为 "终端仿真器"。

这种仿真仍然被称为 "TTY设备"。有2种终端仿真器:虚拟控制台和伪终端

虚拟控制台 Virtual Consoles

在图形化界面占据计算机世界之前,虚拟控制台是与这些日益流行的操作系统进行交互的唯一方式。虚拟控制台是在内核中运行的终端仿真器。

想象一下,你刚刚扔掉了你的大型视频终端。现在你只有一个屏幕和一个连接在电脑上的键盘,这次电脑从键盘接收输入,并在屏幕上显示输出。不再需要视频终端了!

现在,当你启动计算机时,首先会出现登录屏幕。你通过用户账户登录,然后 Shell 会显示一个提示符,等待你输入一些命令。

你可以在虚拟控制台中输入这些命令并按 Enter ,将它们发送到 Shell,然后这些命令将被解释,输出将显示在您的屏幕上。您甚至可以启动其他进程,例如启动一个 Vim 文本编辑器。

但是,如果没有视频终端,我们怎么能够输入命令、在屏幕上看到它们,并将它们传递给 shell(或其任何子进程),而且只有在我们键入 Enter 时才能这样做呢?是什么将我们的输出返回给我们?当然是你的虚拟控制台!即使你丢掉了实际的物理控制台,它仍然存在,继续承担着相同的工作

当你登录虚拟控制台时,一个 shell 进程将附加到终端仿真器的输出上(具体是终端的文件表示,类似于 /dev/tty ,正如上文所说)。shell 会给你一个提示符,你输入的所有内容都将直接发送到 TTY 设备。

虚拟控制台本身在内核中运行,而用户的 Shell 以及其子进程在用户空间中运行

Linux 内核从一开始就考虑到了多用户的需求,为我们提供了多个虚拟控制台,不同的用户可以并行登录。

对于大多数 Linux 发行版来说,如果你已经在一个虚拟控制台上,你可以使用 ALT 键和 F 键(如 F1、F2...一直到 F6,或更多)在它们之间切换。

Linux 用户还可以使用命令 chvt 切换到不同的虚拟控制台:例如, chvt 2 将切换到第二个虚拟控制台。

而使用 who 命令可以查看当前处于第几个虚拟控制台

[root@foundation0 ~]# who
kiosk  seat0    2023-10-25 17:35 (login screen)
kiosk  tty2     2023-10-25 17:35 (tty2)
root   tty3     2023-10-25 19:24

如今,虚拟控制台的作用就是:当图形桌面或网络崩溃时,用户可以切换到虚拟控制台进行调试并解决问题。

伪终端 Pseudoterminals

虚拟控制台在内核中运行。伪终端(或 "PTY")是在用户空间运行的终端。

现在,从图形界面(如桌面)启动的任何终端都是 PTY。

伪终端是如何工作的?

在基于 Linux 的系统中,它首先会打开 /dev/ptmx 文件,然后会打开另外两个文件:

1. PTY 主设备(或 "PTM")的文件描述符。

2. 用于 PTY 从设备(或 "PTS")的文件 /dev/pts/<pty_number>。每次你启动另一个伪终端时,<number> 就会增加。

假设你打开了三个伪终端在基于 Linux 的系统中将被表示为 PTS 文件 /dev/pts/3 。PTM只是一个文件描述符(在表中的一个数字),你在文件系统中找不到它。

然后,一个 shell 将附加到 PTS 上,从 PTS 文件接收输入。当您尝试在伪终端中运行一些命令时,输入首先从 PTM 流向 PTS,然后从 PTS 流向 shell。请看下图

用户输入 -->[用户空间] 仿真终端-->[内核空间] PTM(file descriptor)-->PTS(/dev/pts/2)-->[用户空间] shell --> process1..2

伪终端与虚拟控制台类似,但有两个重要的区别

1. 终端在用户空间运行,而不是在内核中

2. 不再使用一个文件( /dev/tty )来表示整个 TTY 设备,而是使用两个文件(PTM 和 PTS)

回到物理电传打字机的概念,它们通过一对电线与计算机连接。

在这个背景下,'PTM' 或伪终端主文件可以被视为模拟这种物理线路,作为连接用户空间中的终端与内核的管道。

同样,伪终端从设备 'PTS' 执行的功能与虚拟控制台的 TTY 文件(即 /dev/tty<tty_number>)相似:它在终端和使用我们命令的各种进程(如 shell)之间建立接口。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值