【计算机系统导论】5.4 命令行与终端模拟器

这是非常经典的历史问题,从历史说起


Teletype, Teletype Model 33

sh, csh, ksh, bash, ash/dash, zsh, psh, yash, fish

iTerm, ZTerm

真实的硬件终端设备由键盘和显示器组成,用于与远程主机(计算机)进行通信。除了与主机距离比较远(在隔壁房间或者在其它城市)以外,它的使用方式与一台个人计算机没有什么区别。程序是在主机上被执行,但结果是显示在终端屏幕上。终端通常仅限于显示接收到的信息以及在键盘上输入发送给主机的信息。
功能单一的终端设备在上世纪70年代和80年代比较盛行。人们在其上编制程序、运行程序、编写文档或发出打印命令等。终端使用一根电缆与主机相连,有时需要通过modem与在远距离以外的主机连接。
如今使用实际的终端设备已经很少。人们通常利用软件把个人计算机仿真成一个终端与主机相连。现在几乎所有使用Linux的人都使用终端仿真方法。对于不使用X window的情况下,人们使用字符界面的终端(虚拟终端)。这通常也被称为命令行接口。而在X window环境下,我们可以获得多个终端窗口,也有不少的终端仿真程序可以选用,例如xterm、rxvt或者zterm等。所有这些都是使用了仿真的方法来模拟一台真实的终端设备。

随着网上异构操作系统环境的高速发展,特别是Linux/UNIX的蓬勃发展,给日常应用提供了更多、更高和更安全的选择。然而,各种操作系统之间的操作环境相差很大。从事计算机工作的专业人员面临的情况更为复杂。企业内部有很多计算机,在它们上运行的操作系统可能是Windows、Linux、Solaris、OpenVMX、True64、FreeBSD,也可能是HP-UX、AIX或别的Unix系统。
以往UNIX主机会自带多台字符或图形终端供用户使用。但随着网络的飞速发展以及安全上的要求,用户往往远离主机,通过RS232接口连接的串行终端已经成为瓶颈,如何利用Intranet网或Internet网上的PC机访问和管理这些UNIX的服务器已经成为巨大的要求。这时,UNIX仿真软件诞生。即在Windows环境中,仿真出一个远程控制台,作为一个远程终端,通过网络登录到远程Unix系统。


正如前面所说,shell 是一种特殊类型的程序,像壳一样“包裹”住内核,充当人与系统交互的界面。

shell 可以分为两大类:图形界面 shell (GUI shell)和命令行式 shell (CLI shell)。

一般人们省略 CLI,shell 指的就是命令行式 shell,而 GUI shell 直接简称为 GUI。本书以后不特别注明,shell 指的就是命令行式 shell,GUI 指的就是图形界面 shell。听上去有些绕,但实际应用中人们已经习惯这样使用。

先来说 shell,shell 是一种提供基于文本界面的程序:用户可以一个接一个地键入命令,shell 会读取命令,然后完成所需的工作来执行命令。

再来说 GUI,GUI 是一种更复杂精美的程序,使用窗口、鼠标指针、图标等向用户提供图形界面。

Linux 中广为人知的 shell 有 Bourne Shell 家族的 sh、ksh、bash 和 C-Shell 家族的 csh、tcsh。

而有名的 GUI 有 CDE、GNOME、KDE 等,这些 GUI 都运行在一个名为 X Window 的系统之上,这个系统为使用图形数据的程序提供服务。

前面提到的“界面”一词,指的是事物提供的一种与外界进行交互的方式。人使用计算机可以说成是人使用他的界面与计算机的界面交互。

在 Linux 的世界中,将提供界面的设备称为终端(terminal),将其他部件总称为主机(host)。终端有两个主要的任务:接受输入和生成输出。因而计算机系统可以描述为:

• 计算机 = 终端 + 主机

• 终端 = 输入设备 + 输出设备

计算机的终端就是指显示器、键盘、鼠标、扬声器等输入/输出设备,而机箱中的处理器、硬盘、内存、显卡等其他部件的组合就是主机。

其实,人的身体也可以分为“终端”和“主机”:

眼睛、嘴、耳朵以及能改变环境的手、胳膊等身体部分,充当人的输入/输出设备,也就是人的“终端”;而大脑、肌肉、骨骼以及其他的器官就充当人的“主机”。

所以从 Linux 的角度来看,人使用计算机,就是人的终端与计算机的终端进行交互。

正是因为 Linux 系统将终端和主机分离,使得 Linux 是一种真正的多用户系统。只要每个人拥有自己的终端,并且终端与主机相连,多人就可以同时使用同一台计算机。

具体来说,终端可以分为两大类:字符终端(character terminal)和图形终端(graphics terminal)。

字符终端指只使用文本的终端,输入输出只有字符形式,字符终端只有字母、数字、标点符号和几个特殊的控制键。

早期的字符终端,比如 Teletype,仅有一个键盘用于输入,一大卷纸用于输出,以及一个纸带穿孔机和一个纸带阅读机用于存储程序和数据。它没有显示屏,没有鼠标,也没有声音。


图 2-1 Teletype 33-ASR


图 2-2 最流行的字符终端 DEC VT100

后来,随着 PC 技术的发展,出现了更完善的字符终端,再后来出现了图形终端。图形终端在输入方面仍依靠键盘和鼠标;在输出方面,充分利用视频硬件的优点,可以在屏幕上绘制各种颜色和图形。使用图形终端时,可以使用一个成熟的 GUI。

有一台终端比较特殊,它是用来管理系统的,这个特殊的终端就是控制台(console)。

Linux 系统总是区分控制台和普通终端,而且有一些特定的事情只能在控制台上完成。比如说有的时候,系统需要显示一个非常严重的错误消息,它不会显示在普通终端上,而只会显示在控制台上,以确保系统管理员能够看到。

但如果我们是使用本地主机的唯一用户,那么终端也就是控制台。

现在传统的字符终端和图形终端早已退出历史舞台,我们并不使用真正的物理终端来访问 Linux 系统。而是使用计算机来仿真终端,也就是在计算机上运行仿真终端的程序,称之为终端仿真器。终端仿真器的功能就是让我们能够使用 shell(这里指的是壳程序,包括GUI)。

对于 Linux 系统而言,访问终端仿真器的方法有两种:终端窗口和虚拟控制台。

在 GUI 下,运行“Terminal”程序(KDE 用的是 konsole,GNOME 用的是 gnome-terminal),就打开了一个终端窗口。在终端窗口中,可以使用标准的命令行界面输入命令。因为终端仿真器运行在窗口中,所以可以拥有任意数量的窗口,同时运行多个终端。

因为 GUI 运行在 X Window 之上,X Window 提供的终端仿真器叫做 xterm,尽管后来换了程序,但依然叫 xterm,所以终端窗口实际上访问的是 xterm。xterm 既可以仿真字符终端(DEC VT-102),也可以仿真图形终端(Tektronix 4014)。

当 Linux 启动时,同时启动了 7 个不同的终端仿真程序,它们称为虚拟控制台。

虚拟控制台 #1~6 都是全屏、基于文本的终端,用来使用 shell;虚拟控制台 #7 是仿真的图形终端,用来运行 GUI。

可以使用快捷键 + + 在不同的虚拟控制台间切换。例如 + + 切换回仿真图形终端。

基本概念:
1> tty(终端设备的统称):
tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。

2> pty(虚拟终端):
但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty)

3> pts/ptmx(pts/ptmx结合使用,进而实现pty):
pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。
Linux终端:
在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:
1、串行端口终端(/dev/ttySn)
串 行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为 那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如, 在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。可接串口来实验。
2、伪终端(/dev/pty/)
伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。
例 如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty/m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ptyp3(master设备)看作是一个串行端口设备,则它对该端口的读/ 写操作会反映在该逻辑终端设备对应的另一个ttyp3(slave设备)上面。而ttyp3则是另一个程序用于读写操作的逻辑设备。
这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很象是逻辑设备 对之间的管道操作。对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来 使用 ptyp3(m3)逻辑设备。
例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会开始连接到设备 ptyp2(m2)上(一个伪终端端口上)。此时一个getty程序就应该运行在对应的ttyp2(s2)端口上。当telnet从远端获取了一个字符 时,该字符就会通过m2、s2传递给 getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通 过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。
在使用设备文件系统 (device filesystem)之前,为了得到大量的伪终端设备特殊文件,使用了比较复杂的文件名命名方式。因为只存在16个ttyp(ttyp0—ttypf) 的设备文件,为了得到更多的逻辑设备对,就使用了象q、r、s等字符来代替p。例如,ttys8和ptys8就是一个伪终端设备对。不过这种命名方式目前 仍然在RedHat等Linux系统中使用着。
但Linux系统上的Unix98并不使用上述方法,而使用了”pty master”方式,例如/dev/ptm3。它的对应端则会被自动地创建成/dev/pts/3。这样就可以在需要时提供一个pty伪终端。目录 /dev/pts是一个类型为devpts的文件系统,并且可以在被加载文件系统列表中看到。虽然“文件”/dev/pts/3看上去是设备文件系统中的 一项,但其实它完全是一种不同的文件系统。
即: TELNET —> TTYP3(S3: slave) —> PTYP3(M3: master) —> GETTY

3、控制终端(/dev/tty)
如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它 具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。

4、控制台终端(/dev/ttyn, /dev/console)
在Linux 系统中,计算机显示器通常被称为控制台终端 (Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等 称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上(这时也叫控制台终端)。因此不管当前正在使用哪个虚拟终 端,系统信息都会发送到控制台终端上。你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户root可以向 /dev/tty0进行写操作 即下例:
1、# tty(查看当前TTY)
/dev/tty1
2、#echo “test tty0” > /dev/tty0
test tty0

5 虚拟终端(/dev/pts/n)
在Xwindows模式下的伪终端.

6 其它类型
Linux系统中还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。这里不再赘述。

FAQ: 终端和控制台
Q:/dev/console 是什么?
A:/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。目前只有在单用户模式下,才允许用户登录控制台。

Q:/dev/tty是什么?
A:tty设备包括虚拟控制台,串口以及伪终端设备。
/dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。

Q:/dev/ttyS是什么?
A:/dev/ttyS
是串行终端设备。

Q:/dev/pty是什么?
A:/dev/pty
即伪终端,所谓伪终端是逻辑上的终端设备,多用于模拟终端程序。例如,我们在X Window下打开的终端,以及我们在Windows使用telnet 或ssh等方式登录Linux主机,此时均在使用pty设备(准确的说在使用pty从设备)。
Q:/dev/tty0与/dev/tty1 …/dev/tty63是什么?它们之间有什么区别?
A:/dev/tty0代表当前虚拟控制台,而/dev/tty1等代表第一个虚拟控制台,例如当使用ALT+F2进行切换时,系统的虚拟控制台为/dev/tty2 ,当前的控制台则指向/dev/tty2
Q:如何确定当前所在的终端(或控制台)?
A:使用tty命令可以确定当前的终端或者控制台。
Q:/dev/console是到/dev/tty0的符号链接吗?
A: 目前的大多数文本中都称/dev/console是到/dev/tty0的链接(包括《Linux内核源代码情景分析》),但是这样说是不确切的。根据内 核文档,在2.1.71之前,/dev/console根据不同系统的设定可以链接到/dev/tty0或者其他tty*上,在2.1.71版本之后则完 全由内核控制。目前,只有在单用户模式下可以登录/dev/console(可以在单用户模式下输入tty命令进行确认)。
Q:/dev/tty0与/dev/fb*有什么区别?
A: 在Framebuffer设备没有启用的系统中,可以使用/dev/tty0访问显卡。
Q:关于终端和控制台的区别可以参考哪些文本
A: 可以参考内核文档中的 Documents/devices.txt 中关于”TERMINAL DEVICES” 的章节。另外,《Linux内核源代码情景分析》的8.7节 以及《Operating Systems : Design and Implementation》中的3.9节(第3版中为3.8节)都对终端设备的概念和历史做了很好的介绍。另外在《Modern Operating system》中也有对终端设备的介绍,由于与《Operating Systems : Design and Implementation》的作者相同,所以文本内容也大致相同。需要注意的一点是《Operating Systems : Design and Implementation》中将终端设备分为3类,而《Modern Operating system》将终端硬件设备分为2类,差别在于前者将 X Terminal作为一个类别。
PS:
只有2410的2.6才叫ttySAC0,9200等的还是叫ttyS0。


控制台,终端,tty,shell等概念的区别
使用linux已经有一段时间,却一直弄不明白这几个概念之间的区别。虽然一直在用,但是很多概念都感觉模糊不清,这样不上不下的状态实在令人不爽。下面就澄清一下这些概念。

这些概念本身有着非常浓厚的历史气息,随着时代的发展,他们的含义也在发生改变,它们有些已经失去了最初的含义,但是它们的名字却被保留了下来。

控制台(Console)

控制台(Console)是物理设备,用于输入输出,它直接连接在计算机上,是计算机系统的一部分。计算机输出的信息会显示在控制台上,例如BIOS的输出,内核的输出。

终端(Terminal)

终端(Terminal)也是一台物理设备,只用于输入输出,本身没有强大的计算能力。一台计算机只有一个控制台,在计算资源紧张的时代,人们想共享一台计算机,可以通过终端连接到计算机上,将指令输入终端,终端传送给计算机,计算机完成指令后,将输出传送给终端,终端将结果显示给用户。

虚拟控制台(Virtual Console),虚拟终端(Virtual Terminal)

虚拟控制台(Virtual Console)和虚拟终端是一样的。我们只有一台终端(物理设备),这是我们与计算机之间的用户接口。假如有一天,我们想拥有多个用户接口,那么,一方面我们可以增加终端数目(物理设备),另一方面,还可以在同一台终端(物理设备)上虚拟出多个终端,它们之间互相不影响,至少看起来互相不影响。这些终端就是虚拟终端。

在Ubuntu中,我们按下Ctrl+Alt+Fx时,会进入第x个虚拟终端,一共有七个虚拟终端,其中第七个虚拟终端,就是我们默认使用的图形用户界面。

终端模拟器(Terminal Emulator)

我们知道,终端是一种物理设备,而终端模拟器(Terminal Emulator),是一个程序,这些程序用来模拟物理终端。图形用户界面中的终端模拟器一般称为终端窗口(Terminal Window),我们在Ubuntu下打开的gnome-terminal就属于此类。

tty

tty的全称是TeleTYpewriter,这就是早期的终端(物理设备),它们用于向计算机发送数据,并将计算机的返回结果打印出来。显示器出现后,终端不再将结果打印出来,而是显示在显示器上。但是tty的名字还是保留了下来。

在Ubuntu中,我们按下Ctrl+Alt+F1时,会进入第1个虚拟终端,你可以看到屏幕上方显示的tty1。

shell

shell 和之前说的几个概念截然不同,之前的几个概念都是与计算机的输入输出相关的,而shell是和内核相关的。内核为上层的应用提供了很多服务,shell在内核的上层,在应用程序的下层。例如,你写了一个 hello world 程序,你并不用显式地创建一个进程来运行你的程序,你把写好的程序交给shell就行了,由shell负责为你的程序创建进程。

我们在终端模拟器中输入命令时,终端模拟器本身并不解释执行这些命令,它只负责输入输出,真正解释执行这些命令的,是shell。

我们平时使用的sh, bash, csh是shell的不同实现。

sh sh这个概念本身就有岐义,它可以指shell程序的名字,也代表了shell的实现。

Thompson shell是第一个Unix shell,由 Ken Thompso于1971年在Unix第一版本中引入,shell的程序名即为sh。Bourne shell作为Thompson shell的替代,由 Stephen Bourne于1977年在Unix第七版中引入,它的程序名也是sh。Bourne shell不仅仅是一个命令解释器,更作为一种编程语言,提供了Thompson shell不具备的程序控制功能,并随着 Brian W. Kernighan 和 Rob Pike 的 The UNIX Programming Environment的出版而名声大噪。

csh csh全称为 C Shell,由 Bill Joy在70年代晚期完成,那时候他还是加州伯克利大学的研究生。tcsh是csh的升级版。与sh不同,csh的shell脚本,语法接近于C语言。

bash bash是由 Brian Fox为GNU项目开发的自由软件,作为Bourne shell的替代品,于1989年发布。是Linux和Mac OS X的默认shell。bash的命令语法是Bourne shell命令语法的超集,从ksh和csh借鉴了一些思想。

好了,就写到这里,上面的内容是我参考维基百科后写下的,不保证完全正确, 下面还提供了一些资料,如果有兴趣可以阅读一下。


在Linux中,TTY也许是跟终端有关系的最为混乱的术语。TTY是TeleTYpe的一个老缩写。Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,和古老的电报机区别并不是很大。之后,当计算机只能以批处理方式运行时(当时穿孔卡片阅读器是唯一一种使程序载入运行的方式),电传打字机成为唯一能够被使用的“实时”输入/输出设备。最终,电传打字机被键盘和显示器终端所取代,但在终端或TTY接插的地方,操作系统仍然需要一个程序来监视串行端口。一个getty“Get TTY”的处理过程是:一个程序监视物理的TTY/终端接口。对一个虚拟网络服务器(VNC)来说,一个伪装的TTY(Pseudo-TTY,即假冒的TTY,也叫做“PTY”)是等价的终端。当你运行一个xterm(终端仿真程序)或GNOME终端程序时,PTY对虚拟的用户或者如xterm一样的伪终端来说,就像是一个TTY在运行。“Pseudo”的意思是“duplicating in a fake way”(用伪造的方法复制),它相比“virtual”或“emulated”更能真实的说明问题。而在的计算中,它却处于被放弃的阶段。
tty也是一个Unix命令,用来给出当前终端设备的名称。
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。
在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:
串行端口编辑
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0),/dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0),(4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。
伪终端编辑
伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备,对master的操作会反映到slave上)。
例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty /m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ptyp3(master设备)看作是一个串行端口设备,则它对该端口的读/ 写操作会反映在该逻辑终端设备对应的另一个ttyp3(slave设备)上面。而ttyp3则是另一个程序用于读写操作的逻辑设备。telnet主机A就是通过“伪终端”与主机A的登录程序进行通信。
控制终端编辑
如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。
控制台编辑
在Linux 系统中,计算机显示器通常被称为控制台终端(Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上(这时也叫控制台终端)。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。只有在单用户模式下,才允许用户登录控制台。
虚拟终端编辑
在Xwindow模式下的伪终端.如在Kubuntu下用konsole,就是用的虚拟终端,用tty命令可看到/dev/pts/name, name为当前用户名。
其它类型编辑
Linux系统中还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。
tty设备包括虚拟控制台,串口以及伪终端设备。
/dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。
Text Telephones (TTY)
聋哑人电话,在手机插入专用设备后支持收发文本,需网络支持,中国网络不支持TTY.
除聋哑模式外,还支持只听不说(HCO)和只说不听(VCO)两种模式


在古老的年代,一个机构可能只有一台主机,而机构的职员使用电传打印机(Teletypewritter 又简称为tty)通过串口连接到主机。后来人们又在电传打印机的基础上进行了改进,程序的输出不再是打印到纸带上而是显示在荧幕上,后来还支持彩色显示,这样的设备后来被称为终端(Terminal)。一台主机可以有很多个终端,早期的主机只支持串口线的终端,对应的设备叫做串口终端(Serials Terminal),后来又发展出了伪终端,以便于支持GUI,后来串口终端渐渐被图形界面的伪终端取代,也就是我们今天所说的终端。
但是在主机的系统启动完成之前,终端是不能连接到主机上的。为了能记录出主机开机过程的日志,也便于在主机出故障无法启动操作系统时进行检修维护,有多了一个叫做控制台的设备。一台主机有且只能有一个控制台。文件主机的重要日志,比如开机关机的日志和记录,重要应用程序的日志,都会输出到控制台来。


terminal(终端)——指电线的末端,shell——指乌龟的壳,而tty——是一个奇怪的缩写。然后是console——一种机柜。
嗯,这只是词源上的意思。
在UNIX的术语中,最简单的回答是:
终端(terminal)=tty=文本的输入输出环境
控制台(console)=物理终端
shell=命令行解释器

控制台,终端和tty是密切相关的。原本它们都表示一台可以和计算机交互的设备:在UNIX的早期阶段,此类设备大多指电传机器(像一台打字机一样),这种设备有时也叫做电传打字机,缩写为TTY。“终端”(terminal)这个名字是从电子的观点来看的,而“控制台”是从设备的角度来看的。在UNIX历史的极早期阶段,电子键盘和显示器就已经是一种规范的终端。
在UNIX术语中,tty是一种特殊的设备文件,它在read和write之外还实现了一些特殊的命令(ioctls)。通常意义上terminal是tty的代名词。有的tty由(软件)内核来代替硬件设备,比如从键盘发送过来的input,以及发送到文本模式的屏幕上的output,或者在串行线上传输的input/output流。还有一种tty——有时候叫做伪tty(pseudo-ttys)的,它是由叫做”终端模拟器“的程序提供的(通过一个中间层),这种tty例如Xterm(运行在X window系统上),Screen(在一个程序和另一个终端之间提供了中间层),SSH(在另一台电脑上,通过程序连接另一台点奥上的终端),Expect(用脚本和终端交互)之类。

“terminal”这个词通常也有一个更加传统的意思,表示一台能够用来和电脑交互的设备——通常有显示器和键盘。比如一个X terminal(一种瘦客户机——一种特殊用途的计算机),它唯一的作用就是驱动键盘,显示器,鼠标,(偶尔还有)别的外围交互设备;而实际上程序是泡在另外一台更加强大的计算机上的。

Console通常的物理意义上是通过一些手段直接连到机器上的主终端(primary teminal),在一些操作系统(比如Linux和FreeBSD)上console一般有好几个tty(用特定的组合键能够在这些tty之间切换)。有时候这些命名让人混乱,比如操作系统可能把那些tty叫做”console“ ”virtual console“ ”virtual terminal“之类的。

那么,既然说一个虚拟终端是”虚拟(virtual)”的,什么又是“真的”终端?

shell,作为用户登录系统时看到的主界面,它主要的用处就是启动别的程序。(我不确定原来的比喻义是指shell是用户的home环境,还是说shell是其他程序在里面跑的环境)
在UNIX圈里,shell 特指命令行shell(并且围绕这这样的描述: “输入你想要运行的应用的额名字,后面跟着文件或者其他的、应用程序应该据此作出调整的东西(翻译:就是参数啦) ,并按回车键。”) 其他类型的环境并不使用“shell”这个词,比如说窗口系统涉及了”窗口管理器“(window managers) 和”桌面环境“(desktop environments),但并不使用”shell“这个词。
UNIX shell有很多,比较流行的交互式shell包括bash(大多数Linux发行版的默认选择) zsh(重视功能和可定制性) 还有fish(以简单为主旨)。

命令行shell包括了用来组合命令的流程控制结构。除了在交互式提示符下输入命令外,用户还可以编写脚本。大多数shell都有一套共同的语法(基于Bourne shell)。当我们讨论”shell编程”时,shell几乎都指Bourne风格的shell。有的shell经常用来运行脚本,但缺少足够的交互功能(比如说Korn shell——ksh,以及ash的许多变种)。 几乎所有的UNIX-like操作系统都有一个Bourne风格的shell(路径一般是/bin/sh)——而且 不是ash ksh 就是bash。
在UNIX系统管理中,一个用户的shell是那个在登录的时候被调用的程序。普通用户账户也拥有命令行shell,受限的用户(比如仅用于传输文件的账户)可能拥有一个受限的shell,或者只能运行特定命令的shell。

终端和shell之间的分工并不是很明显,下面是它们的主要工作:
输入:终端把键盘操作转换成控制序列(比如Left 转换为 \e[D)。shell再转换控制序列成为命令(比如\e[D 转换为后退字符)。在行编辑(line editon)中,输入历史和输入补全功能是shell提供的。
终端有时候会在它自己的行编辑功能中提供输入历史和输入补全功能,并且在命令要执行时通过line发送到shell中。唯一这样做的主流terminal就是Emacs里的M-x。
输出:shell发出指令,比如说“display 某某” “切换前景色位绿色” “把光标移动到下一行”之类。而终端就响应这些指令。
命令提示符是纯粹的shell概念。
shell永远开不到它所运行的命令的输出(除非重定向),输出历史(回滚)仅仅是个终端上的概念。
应用程序之间的复制粘贴是由终端提供的(通常用鼠标,或者组合键,比如Ctrl+SHift+V 或Shift+Insert)。 Shell可能有它自己的内部复制粘贴机制(比如Meta+Y,Ctrl+Y)。
作业控制(在后台启动程序,并且管理这些程序)主要是由shell执行。不过,是由终端来处理组合键的(比如Ctrl+C 杀死前台程序,或者Ctrl+Z终止任务运行)。

The TTY demystified

http://www.linusakesson.net/programming/tty/

https://en.wikipedia.org/wiki/Computer_terminal

捧个钱场?