关于Unix/Linux的终端、伪终端、控制台和shell
历史是什么:是过去传到将来的回声,是将来对过去的反映。 ——雨果(法)《笑面人》
阅读本文大概需要花费你15分钟
文章导航:
- 计算机的发展
- UNIX系统的诞生
- UNIX系统的发展
- 终端与控制台
- 什么是shell
- GUI和伪终端
1. 计算机的发展
第一台计算机是什么时候诞生的?这不是一个容易回答的问题,因为有很多不同的“计算机”定义的分类,比如机械计算机、电子计算机,我甚至可以将算盘也定义成一种计算机。
1946年2月14日(美国时间2月15日 :D),世界上第一台电脑 ENIAC 在美国宾夕法尼亚大学诞生。它发明的目的是用于二战,这部机器使用了18800个真空管,长50英尺,宽30英尺, 占地1500平方英尺,重达30吨(大约是一间半的教室大,六只大象重)。它的计算速度快,每秒可从事5000次的加法运算,运作了九年之久。吃电很凶, 据传ENIAC每次一开机,整个费城西区的电灯都为之黯然失色。
另外,真空管的损耗率相当高,几乎每15分钟就可能烧掉一支真空管,操作人员须花15分钟以上的时间才能找出坏掉的管子,使用上极不方便。曾有人调侃道:“只要那部机器可以连续运转五天,而没有一只真空管烧掉,发明人就要额手称庆了”。
下面的图片就是 ENIAC 的真身:
从上面的图可以看出早期的计算机是多么庞大和笨重,下面看一下早期计算机的配置
历史内存大小及其价格
时间 | 生产商 | 大小(KB) | 销售价(美元) | 造价(美元)/MB |
1957 | C.C.C. | 0.00098 | 392 | 411,041,792 |
1960 | E.E.Co. | 0.00098 | 5 | 5,242,880 |
1965 | IBM | 0.00098 | 2.52 | 2,642,412 |
1970 | IBM | 0.00098 | 0.70 | 734,003 |
1975 | MITS | 0.25 | 103 | 421,888 |
1980 | Interface Age | 64 | 405 | 6,480 |
1985 | Do Kay BYTE | 512 | 440 | 880 |
1990 | Unitex BYTE | 8,192 | 851 | 106 |
1995 | Pacific Coast Micro | 16,384 | 494 | 30.9 |
2000 | Crucial | 65,536 | 72 | 1.12 |
2005 | Corsair | 1,048,576 | 189 | 0.185 |
2010 | Kingston | 8,388,608 | 99 | 0.0122 |
2013 | Crucial | 16,777,216 | 88 | 0.0054 |
2014 | Patriot | 32,000,000 | 294 | 0.0091 |
从表格中可以看到,1995年,电脑的内存大概在16M的规模,2000年的时候,大概在64M的规模,价格约500元人民币,此时我才小学四年级??对此没有印象,但相信有的人对此记忆犹新吧。
1960年时,计算机的价格是令人难以承受的,早期的大型计算机的价格大约是在500万美元到1000万美元之间,每个月按月出租也需要17000美元,这样昂贵的设备只有大公司和大学教育机构才能负担的起。
2. UNIX系统的诞生
由于大型机过高的价格,美国国防部部门想要在这样的计算机上开发出一套系统multics:该系统通过建置在美国通用电力公司的大型机GE-645,来连接1000部终端机,支持300的用户同时上线。通俗来说,就是国防部门想要一个分时操作系统达到注册用户1000人,最高并发300人的效果。
下图是类似GE645的GE-235大型机:
该项目由AT&T、通用电器公司、麻省理工学院参与,经过4年时间,最终还是失败。两位神一样的人物:Ken Thompson和Dennis MacAlistair Ritchie 在此之后发明了UNIX和C语言。Ken Thompson参与了multics项目,从中获得经验和灵感,并利用小型机pdp-7开发出了UNIX,之后还和Dennis MacAlistair Ritchie共同发明了C语言,并用C语言重写了UNIX使其可以在不同品牌的机器上快速移植。
下面是小型机pdp-7的图片,该型号小型机目前在美国的西雅图Living Computer Museum(活电脑博物馆)还能看到。
3. UNIX系统的发展
随后,由于UNIX易用、可移植且免费,之后迅速扩散开来,但UNIX是Ken Thompson和Dennis MacAlistair Ritchie在AT&T公司的贝尔实验室工作期间鼓捣出来的,版权属于AT&T,起初AT&T由于垄断电信通讯业务,美国政府不允许其涉足计算机行业,另外AT&T也觉得UNIX是个小玩意不挣钱,未予关注,任其发展。后来UNIX壮大后,AT&T欲利用UNIX从事商业软件活动,作为其商业产品欲营利,为了一家独大,AT&T想要收回起初免费使用UNIX的权利。而此时UNIX已经因为源代码公开而形成了很多的实现和版本。
总结来说:1969年Ken Thompson在AT&T公司发明了Unix系统,而后Thompson在加州大学伯克利分校和AT&T公司的Unix部门各自维护了一个实现,分裂成了2种版本。
分裂的2种版本各自吸收使用了对方的一些特色和专有源码,并相互起诉,最终和解。
分裂的2种版本导致各种不同的演化,结果是UNIX的各种实现很乱,上层的应用程序不便移植,最后大家要求统一,最终由此产生了统一标准。
更详细的说明,可参考阮一峰先生的文章:Unix版权史
总之,UNIX分裂成了两大主流分支,很多其他的分支实现基本上是基于BSD或者System V。
4. 终端与控制台
Ken Thompson和Dennis MacAlistair Ritchie发明的UNIX可以在pdp-7上使用,相比于大型机500万—1000万美元的价格虽然不多,但pdp-7的价格也不菲,高达72000美元。仍然没有办法人手一台,但总算让一个普通公司有可能采购了。
一台小型机有控制台、Terminal终端、主机三大部分。在文章的第二个图片“类似GE645的GE-235大型机”那里,为什么我要贴那样的照片?就是想让你直观感受一下:小型机有控制台、Terminal终端、主机。
想象一下,我们平时用的台式机器:主机+键盘+显示器,这里的主机就和以前的小型机的主机一样,负责计算,内含CPU、主板等原件。今天的台式机,主机负责运行操作系统,跑程序,键盘负责打字输入,显示器负责输出显示结果。
那么以前的小型机的控制台和Terminal终端是干什么用的?控制台,英文叫做console,从字面意思可以看出是用来做控制的。回忆一下课本上关于计算机操作系统发展历史的说明:
最初的电脑并没有操作系统,人们通过各种操作按钮来控制计算机,后来出现了汇编语言,操作人员通过有孔的纸带将程序输入电脑进行编译。这些将语言内置的电脑只能由操作人员自己编写程序来运行,不利于设备、程序的共用。为了解决这种问题,就出现了操作系统,这样就很好实现了程序的共用,以及对计算机硬件资源的管理。
那时候,一台大型机或者小型机的使用,不仅有程序员写程序,还有专业机器操作人员和管理人员,每个人有每个人所负责的部分,各人分工不同。这里的管理人员就是对计算机进行控制的工作人员。那么,控制计算机什么呢?需要在计算机启动时控制它的各个硬件,比如寄存器,拔插各种连接线,可以回头看一下本文开头关于 ENIAC 的图片,上面是不是很多的线需要连接?另外还要根据系统启动和运行时的实时情况来查看指示灯的状态和系统运行的告警、错误等日志信息,这就是控制台。从这里的说明可以看出,控制台因为要控制硬件和连接线,所以务必是要直接连接在大小型机的主机上的。
下面图中红色方框的就是console了:
有了console控制台,可以控制大小型机的启动和对其进行硬件管理,但计算机是拿来提供服务的,只能管理是远远不够的,如何为用户或者程序员提供服务呢?那就是通过终端terminal来和计算机进行交互,告诉计算机你想要做什么,然后计算机在终端中显示处理的结果。
通常在系统启动之前,终端是不能连接到主机的,只能console控制台连接。下图就是console和terminal的实物图:
从图中,我们可以看到,一个显示器样的屏幕和一个键盘,这就是终端terminal,用来输入输出,和计算机交互的设备。至此,我们应该彻底明白,console控制台和terminal终端的区别了:一个负责控制;一个负责供用户使用,与计算机进行工作交互。那么,在这里有一个问题:在Linux系统上,当你按下CTRL + ALT + F1时启动的那个黑色界面是console还是terminal?答案是terminal,为什么?因为你是在那里进行登录后与计算机交互。当你重启Server版纯命令行的Linux系统时,会看到屏幕上有很多的信息输出,那一刻你的屏幕则是console控制台的角色。
UNIX是从multics获得的灵感,而multics设计的初衷就是多用户,基于pdp-7开发出的UNIX自然也是一个支持多用户的操作系统,但pdp-7只有一个终端,只能同时一个用户使用,如何支持多用户呢?Ken Thompson和Dennis MacAlistair Ritchie使用了电传打字机来替代终端,电传打字机的英文名称是Teletype,缩写为TTY。电传打字机带一个键盘,也能打印纸张进行文字输出,而且价格低廉,因此可以用来作为UNIX的另一种终端。
需要注意的是,起初Terminal终端和TTY打字机并不是同一种东西,Terminal终端是只有一个,而TTY打字机可以有一到多个。另外,Terminal终端是本地,TTY打字机是远程,此远程非今天的网络远程,是地理位置上的远程,比如TTY打字机用很长的线缆连接到小型机的插口上,无需互联网,而且当时也没有网络。因为TTY打字机是一种终端设备,硬件连接到主机,所以终端的数量也是有限的。由于Terminal终端和TTY打字机扮演的终端的功能相同,所以后来用TTY来统称各种类型的终端设备。另外,之后的TTY终端设备可以通过串口来连接主机进行通信(串行点到点),这个名字也用来指任何的串口终端设备。
无论使用本地Terminal终端还是TTY打字机终端登录系统时,都属于终端登录,与此相对应的是网络登录,进而引申出来伪终端,至于什么是伪终端,我们稍后再讲解。
下面的图就是电传打字机:
仔细观察上图电传打字机的键盘,细心的读者会发现,该打字机的键盘和我们今天的键盘不太一样,少了好几个按键,比如上下左右,比如回车(Enter),比如删除(有的还没有退格键),但也多几个按键,比如第二排的最后两个键。
前面我们说过,电传打字机带一个键盘,也能打印纸张进行文字输出。电传打字机的输出印在纸上,用户输入的字符就像打字机一样也是删不掉的,而且用户输入什么就会立刻传给主机,由于这种终端很弱,所以也被称作"哑终端";由于哑终端的可行和廉价,哑终端开始流行起来,之后一些制造商开始实验生成终端基本的图像功能,其中比较注明的就是DEC公司的vt系列终端。再后来有了以电子显示器为输出设备的终端,一开始也只能一个字符一个字符地给主机发信息,到七十年代末能用终端设备自带的缓冲来缓存用户输入的信息,然后再一次性给主机发送一整行信息的"智能"终端才成为主流。由于终端设备能够进行缓存,所以在发送给主机之前可以进行修改错误的输入,此时键盘上才有了现代电脑用户觉得司空见惯的上下左右方向键和删除退格键,以便对输入进行修改。
这里还涉及到一个历史典故:回车和换行的故事。从上面的电传打字机的图片中可以看到,该打字机每次打印一行,打印一行之后磁头和纸张接触的那个地方位于纸张当前行的最右侧,磁头要回到纸张的下一行最左侧的地方继续打印,从上一行最右侧移动到下一行最左侧这个过程需要耗费0.2秒,这0.2秒内正好可以打两个字符。如果一行只能打印10个字符,而打字机收到连续20个字符,那么在打完10个字符之后,换到下一行用去的0.2秒就会导致有2个字符没打印出来而丢失,最终只有18个字符。
如何解决这个问题?研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做"回车",告诉打字机把打印头定位在左边界;另一个叫做"换行",告诉打字机把纸向下移一行。这样刚好用回车和换行这2个无意义字符占用移动磁头所需的0.2秒的时间空缺,也即打字机收到22个字符,1-10字符有意义,11-12字符为回车和换行,13-24字符有意义,在应该打印到11-12字符时,打字机换到下一行最左侧,丢掉11-12字符,不会导致信息错误。
早期的打字机(计算机发明之前)似乎还是手动回车和换行,所以上面的图片能看到"回车"(RE-TURN,第二排最后一个)和"换行"(LINE FEED,第二排倒数第二个)按键。后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵(可以回头看一下本文前面关于内存大小及其价格的表格),一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧,Unix系统里,每行结尾只有"<换行>",即"\n";Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";Mac系统里,每行结尾是"<回车>"。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
当然,今天随着技术的进步,早已没有了换行和回车的区别,也就不再有RE-TURN和LINE FEED这两个键,统一的使用Enter来替代了。
之后,还是随着技术的进步,CPU、主板、输入输出设备等设备和缓冲技术的飞速发展,console控制台、tty终端这些不再是单独的设备,而是全部被现代的键盘和显示器所整合、代替。因此,console控制台和tty终端也就消失了。现在计算机的console控制台和tty终端都是虚拟出来的概念了,在概念上,键盘和显示器既是console,又是tty。至于什么时候是console,什么时候是tty,取决于那一刻在做什么。比如在我们的系统启动时,我们还能看的console控制台的影子。
下面的图就是类UNIX系统启动时的日志输出,也是退化后的console(退化后的console不再管理各种连接线,简单地保留了日志查看的基本功能,或者当你忘记root密码时,进行系统的“修理”)
5. 什么是shell
在了解了什么是终端和控制台之后,就很容易理解什么是shell了。再次回忆一下,什么是计算机系统?套用鸟哥的一句话:没有插电的计算机是一堆废铁,那么插了电的计算机是什么? 答案是:"一堆会电人的废铁"! 是的,插了电的计算机只是一堆会电人的废铁而已,要想发挥计算机的作用,不仅要有硬件,还要有软件,要安装系统,要上网就要用浏览器,要聊天,就得安装QQ。因此,计算机系统由计算机硬件和软件两部分组成。同样的,终端也是有两部分组成,一部分是终端的硬件:键盘+显示器,另一部分就是shell软件。你在终端里面敲键盘打字,shell软件接收你的输入,然后传递给操作系统,操作系统接收后进行处理,处理完毕后返回。相信到这里,shell是什么概念就不言而喻了,用晦涩的术语来描述就是:shell是人机交互的接口。
6. GUI和伪终端
GUI是图形界面的术语称呼。
虚拟终端和伪终端不同,资源抽象,一个真实存在,一个为提供逻辑抽象而虚拟的接口。
最后,本文根据互联网搜索、部分书籍参考、博客和问答社区以及英文翻译综合整理写出,由于对整个计算机历史并不了解,因此必然存在某些错误,恳请读者予以批评和指正,感谢!