浅析Linux控制台、终端与shell之间的关系

当使用linux时,我们经常会遇到终端和外壳程序的概念。 例如,在桌面版ubuntu中,我们可以右键单击桌面,然后单击“打开终端”以打开终端。 此时,我们可以在终端中输入linux命令。 可能有人会问,这不是错字吗? 那么终端和外壳之间是什么关系呢?
1什么是终端
对于什么是终端,我们先看一个定义。可以看出终端就是一个输入输出设备,简单的可以理解为鼠标,键盘和显示器。但是这个好像跟linux中终端的概念有些出入,下面听我来娓娓道来。
a combination of a keyboard and output device (such as a video display unit) by which data can be entered into or output from a computer or electronic communications system.
但如果想理解了解什么是终端,还需要从“远古”时期说起。在1970年之前,那个时候还没有个人电脑。那个使用只有大型机和小型机,也就是衣柜那么大的计算机。当时比较著名的计算机如dpd-7和ge-45等。
当时ken thompson和dennis ritchie(就是下图中的两位大神)负责在dpd-7上面开发一个新的操作系统,没错,就是unix操作系统。为了提高计算机的使用效率,他们打算让这个操作系统支持多个用户同时使用这台计算机。
但是,当时的显示器是一个非常贵的设备,不太可能每个人都有一个显示器。因此两个人想出了一个变通的方法。他们选择了便宜的电传打字机来做终端设备。这个电传打字机(teletype)就是asr33,就是下图这个设备。
这个设备通过键盘将信息输入计算机当中,而计算机的输出则是通过上面的纸打印出来。这样unix就成为世界上第一个支持多用户的操作系统,而asr33则成为第一个unix终端。后来,缩写tty也就是用来表示unix或者linux终端了。
随着技术的发展和硬件价格的不断降低,终端也变得越来越先进和便宜。1970年,dec发明了vt05视频终端。就是下面这个东东,可以看出她有个小显示器。也越来越像现在的键盘显示器了。
聊到这里我们知道了,所谓终端,其实就是一个物理设备,也就是计算机的输入输出设备。
2什么是控制台
在上个世纪70年代,终端是通过线缆连接在主机上的。同时,在主机上还有一种特殊终端,它是直接集成在主机上的。这个特殊的终端被称为控制台。这个终端的特点是只能被管理员使用。每一个计算机只有一个控制台,它在外观上与普通终端并没有太大的差异,但最重要的是控制台可以做一些普通终端不能做的事情。
比如当操作系统出现启动失败的时候,它会打印一些信息到控制台上,但终端并不会收到该信息。另外,当操作系统以单用户模式启动的时候,我们就只能通过使用控制台来登录了。这个时候其它终端是没有权限登录的。
3linux操作系统的终端模拟器
前面我们了解到终端实际上是硬件设备,但是前面我们在ubuntu上可以用菜单打开一个终端(open terminal)。其实,我们打开的这个窗口也是一个终端,我们称这个终端为终端模拟器,它是用软件的方式来模拟一个终端设备。有的时候我们又称它为虚拟终端。
如果你使用的是gnome终端,我们可以通过下面命令看一下它的帮助问答。
man gnome-terminal
可以看出gnome-terminal就是一个终端模拟程序,而它的功能就是访问unix shell。
gnome是用来模拟xterm的,而xterm本身也是一个终端模拟器。它模拟了vt102物理终端。
打开linux虚拟终端的方法有很多种,如果我们使用的是桌面版的linux,也就是图形界面版的。那么通常我们可以通过命令打开一个命令行终端。如下所示。
另外,linux操作系统起来的时候默认是有7个虚拟终端的。这些虚拟终端并非前面所说的在桌面中打开的虚拟终端,而是通过显示器直接显示的。我们可以通过快捷键在这些终端之间进行切换,比如ctrl+alt+ f1可以切换到第一个终端,而ctrl+alt+ f2可以切换到第二个终端,以此类推ctrl+alt+f7可以切换到第七个终端。通常情况下对于图形界面来说,第七个是图形终端,其它是文字终端。
通过前面的介绍,我们从外面理解了关于终端、控制器和虚拟终端等概念。也对linux操作系统中虚拟终端有所了解。接下来我们将进一步的深入介绍到linux的内部。
4什么是shell
其实我们在前面文章中介绍过关于shell的内容。shell其实就是一个应用程序,它实现了用户对操作系统访问的接口。比如我们常见的管理文件,用户和网络资源等等,都是通过shell来完成的。
shell是一个应用程序,同时它又有很多具体的实现,比较常见的包括bash、zsh、 csh和ksh等等。
我们前面了解到终端是个物理设备,它被用户用来输入和现实信息,而目前我们使用的虚拟终端则是对物理设备的模拟。shell则是用来执行用户命令的。这样我们现在就很容易理解终端和shell的关系。
如果我们通过桌面版打开一个虚拟终端的话,那么终端和shell的关系如下图所示。
如果我们不是通过本地的设备连接的,而是通过网络来访问计算机的话,那么其关系如下图所示。可以看出,这里面有个pty的组件起了比较关键的作用,它建立了两者之间的关联。
1linux系统中的tty、pty和pts
前面我们从概念层面对终端、控制台和shell等进行了介绍。但是这些概念在linux操作系统中是怎样的呢?它们之间的关系又是怎样的呢?
前面已经介绍过tty,它是一个终端,也就是一个输入输出设备的集合。而目前在linux中都是通过虚拟终端来与计算机交互的,因此在linux中tty其实就是虚拟终端,可以将其理解为一个软件。如果我们同时按住ctrl+alt+f5就可以切换到虚拟终端5,具体如下。
在linux操作系统中,软件的整体架构要复杂一些,这是因为linux不仅仅要支持虚拟终端,还有能够支持键盘显示器的物理外围设备,还要支持通过telnet或者ssh等网络的形式的连接。如下图给出了一个完整的示例。
为了支持不同类型的接入方式,在linux实现了一个伪终端的概念,也就是pty。其中p是pseudo的缩写。
伪终端分为两部分,如上图所示,包括master和slave两部分。其中master实现了对不同接入方式的适配,它实现对来自不同设备或者软件消息的解析,将结果传输给slave;而slave端其实就是一个虚拟终端,它实现了与shell的交互,对于shell来说,ptsiu是一个终端设备。
可能还是不太好理解,我们举一个具体的例子,比如telnet实现对远程计算机的管理,其实在客户端就是发送的各种字符串,通过网络发送给telnet守护进程,然后telnet守护进程调用master的功能实现解析。
今天我们主要从概念和架构的层面介绍了终端、控制台和shell等概念,并介绍了linux操作系统中常见的诸如tty、pty和pts等名称。后面我们以一个具体的实例来让大家更加清楚的理解上述架构。


机场用无人机维护地面设备
全球机器人产业格局 中国工业机器人产业链
未来让机器人当大厨,给你炒菜做饭,期待吗
非晶硅光电池
电子屏幕对眼睛有哪些潜在的危害?
浅析Linux控制台、终端与shell之间的关系
阿尔法狗已逝?AI领域才刚刚开始
FPGA技术呈现的4个主要的发展动向
绕线型片式电感应用噪声变大的原因
一阶低通滤波器的截止频率
基于一站式方案打造的区块链平台即服务Morpheus Labs介绍
非隔离型降压转换器的设计案例-电源IC的选择和设计案例
DC-DC转换器电源管理IC(PMIC)优势
巨头进场,独角兽公司壮大,行业发展的头部效应愈加明显
2018年智能家居和智能建筑传感器市场预测
在ubuntu20.04中如何初始化rosdep
斩获AIoT新维奖两项大奖,移远通信以卓越算力产品引领智能物联新未来
网络攻击如何对企业造成威胁?
国芯思辰 | 新型铁电存储器PB85RS2MC在电子凸轮控制器中的应用
研究小组将人工智能与传感器相结合