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

news2025/1/16 14:52:28

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

①微思网络,始于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)之间建立接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1519146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作中Git如何切换远程仓库地址

工作中Git如何切换远程仓库地址 部门之前的仓库不用了&#xff0c;重新建了一个仓库&#xff0c;但是上传代码还是上传到了之前的仓库里面了&#xff0c;所以得进行修改&#xff0c;下面将修改地址的方法进行操作。 方法一、直接修改远程仓库地址 查看当前远程仓库地址 git …

【图形界面】学生宿舍信息管理系统,简单,模板框架,含完整代码

目录 开发一个学生宿舍管理系统 概述 开发环境 程序设计 功能展示 主菜单 添加学生信息界面 删除学生信息界面 修改学生信息界面 查询学生信息界面 5. 完整代码 6. 总结 开发一个学生宿舍管理系统 在本文中&#xff0c;我们将介绍如何使用Python和Tkinter库开发一…

P1149 [NOIP2008 提高组] 火柴棒等式

题目描述 给你 &#xfffd;n 根火柴棍&#xff0c;你可以拼出多少个形如 &#xfffd;&#xfffd;&#xfffd;ABC 的等式&#xff1f;等式中的 &#xfffd;A、&#xfffd;B、&#xfffd;C 是用火柴棍拼出的整数&#xff08;若该数非零&#xff0c;则最高位不能是 00&…

【MySQL】4. 表的操作

表的操作 1. 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c…

iOS面试题锦集

1. 问&#xff1a;一张图片所占内存大小跟什么有关&#xff1f; 图片所占内存大小&#xff0c;与图片的宽高有关 我们平时看到的png、jpg、webp这些图片格式&#xff0c;其实都是图片压缩格式。通过对应的算法来优化了大小以节省网络传输与本地保存所需的资源。 但是当我们加…

Nuxt3配置本地访问链接 -- Network: use --host to expose

这种表示没有在线访问本地链接 在nuxt.config.ts里面 export default defineNuxtConfig({// 配置本地访问链接devServer: {host: 192.168.1.41,//自己电脑的Ipport: 3000,}, }) 复制到浏览器就可以访问&#xff0c;给别人使用必须是局域网&#xff0c;同一个网络

FreeRTOS学习第10篇--队列使用示例

FreeRTOS学习第10篇–队列使用示例 本文目标&#xff1a;FreeRTOS学习第10篇–队列使用示例 按照本文的描述&#xff0c;可以进行简单的使用队列。 本文实验条件&#xff1a;拥有C语言基础&#xff0c;装有编译和集成的开发环境&#xff0c;比如&#xff1a;Keil uVision5 …

独家授权!广东盈世获网易邮箱反垃圾服务的独家授权,邮件反垃圾更全面

近日&#xff0c;广东盈世计算机科技有限公司&#xff08;以下简称“Coremail”&#xff09;成功获得了网易&#xff08;杭州&#xff09;网络有限公司&#xff08;以下简称“网易”&#xff09;授予的网易邮箱反垃圾服务独家使用权。这一授权使得Coremail能够在邮件安全产品上…

创建出色用户界面的五个关键技巧,助您实现用户体验的提升!

易于理解的用户界面通常很容易阅读&#xff0c;它们有美丽的布局和完美的颜色组合&#xff0c;通过提供简单和直观的选项&#xff0c;告诉用户应用程序可以做什么。 因此&#xff0c;在创建用户界面时&#xff0c;&#xff08;UI&#xff09;当时&#xff0c;UI设计师往往优先…

人大金仓大小写敏感处理

人大金仓安装的时候&#xff0c;不管是否选择大小写敏感&#xff1b;查询的时候加和不加双引号&#xff0c;查询出来的都是小写 针对人大金仓大小写&#xff0c;我们实际引用全是大写的情况&#xff0c;解决方案如下 添加配置&#xff0c;将查询结果全都转成大写 1、本地打开…

FastAPI 是什么?深入解析

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建基于 Python 的 API。它是一个开源项目&#xff0c;基于 Starlette 和 Pydantic 库构建而成&#xff0c;提供了强大的功能和高效的性能。 FastAPI 官网地址&#xff1a;fastapi.tiango…

npm WARN config init.license Use `--init-license` instead.

背景&#xff1a;近期升级本地node版本&#xff08;v14.15.4 --> v18.19.1&#xff09;&#xff0c;npm -v报警 npm WARN config init.license Use --init-license instead. npm WARN config init.author.name Use --init-author-name instead. 分析&#xff1a; npm高版本…

使用pgadmin备份数据库

本人菜鸟&#xff0c; 在使用PostgreSQL数据库的时候&#xff0c; 经常会用到这个pgadmin的可视化工具 这个工具提供了很简单的备份和还原方法&#xff0c; 操作如下 备份 (1)首先鼠标右键选中你要备份的数据库&#xff0c;如图的 LBSYS (2)然后点击 backup &#xff08;…

【SVG】前端-不依靠第三方包怎么画连线???

如何用SVG实现连线功能 在Web开发中&#xff0c;我们经常会遇到需要在页面上绘制图形或者实现一些图形交互的场景。SVG&#xff08;Scalable Vector Graphics&#xff09;作为一种用于描述二维图形的XML标记语言&#xff0c;在这方面提供了极大的便利。本文将以一个具体的例子…

WordPress网站启用cloudflare的CDN加速后,网站出现多重定向无法访问

这是一个使用Hostease的Linux虚拟主机的客户反馈的问题&#xff0c;Hostease的虚拟主机使用的也是cPanel面板&#xff0c;客户使用的是cPanel的softaculous安装的WordPress&#xff0c;但是在安装完成后&#xff0c;并且解析了域名之后&#xff0c;发现网站无法访问&#xff0c…

高校实验室科研仪器开放共享存在的问题及对策建议

随着科技的迅速发展和高校科研水平的提高&#xff0c;高校实验室科研仪器的开放共享已经成为推动科研进步和创新发展的重要手段。然而&#xff0c;在实际操作中&#xff0c;我们也面临着诸多问题和挑战。本文将分析高校实验室科研仪器开放共享存在的问题&#xff0c;并提出相应…

java复健-接口的开发及参数校验

遇到的问题以及解决方案 Q1. 开发接口的流程 A1&#xff1a; 明确需求阅读接口文档思路分析开发测试 Q2. 开发时用到的技术 A2&#xff1a; LomBok&#xff1a;Data&#xff0c;自动为我们的实体类创建构造方法&#xff0c;set&#xff08;&#xff09;&#xff0c;get&am…

8. C++对象模型

1. 普通类对象是什么布局&#xff1f; struct Base {Base() default;~Base() default;void Func() {}int a;int b; };int main() {Base a;return 0; }2. 带虚函数的类对象是什么布局&#xff1f; struct Base {Base() default;virtual ~Base() default;void FuncA() {}v…

Uni-app跟学笔记(五):uni-ui组件库的使用、项目打包(小程序、h5、APP)

文章目录 1&#xff09;uni-ui组件库的使用2&#xff09;项目打包1&#xff1a;微信小程序打包2&#xff1a;h5打包3&#xff1a;安卓打包 本博客为 uni-app 此门课的跟学笔记&#xff0c;目的是便于个人复习和对知识快速索引&#xff0c;源码素材可在均可在视频评论区找到 1&a…

Vue2 父子组件某一属性的双向绑定

原本&#xff1a;父组件使用props传值给孩子组件初始化&#xff0c;触发事件子组件使用$emit传值给父组件&#xff0c;很麻烦后来&#xff1a;使用computed和$event例子代码&#xff1a; <template><div class"box">grandpa <el-input v-model"…