Linux的使用者可能每天都会接触到 Bash、Shell、控制台、终端。它们之间有什么不同吗?本文为你快速解释这些概念以及它们的区别。
什么是终端
首先我们来弄清楚什么是终端(terminal)。按照百度百科的解释是:“经由通信设施向计算机输入程序和数据或接收计算机输出处理结果的设备。” 听起来似乎有点晦涩,其实用台式PC机来举例就很容易理解了。一台台式机是由主机(机箱)和很多外围设备组成的。主机里边包括主板、CPU、内存、硬盘、和其他芯片等等。外围设备包括显示器、鼠标、键盘、耳机、麦克风、和摄像头等等。这些外围设备就被称为终端,负责向主机输入数据的就叫输入终端,比如鼠标、键盘、麦克风、摄像头,负责接收主机输出数据的设备就被称作输出终端,比如显示器、耳机。
所以有两个概念我们这里就清楚了:
计算机 = 主机 终端
终端 = 输入终端 输出终端
终端的类型
终端,除了可以分为输入终端与输出终端外,还可以按照与主机的距离可以本地终端和远程终端,或者按照与主机的连接方式分成物理终端和虚拟终端。
举个例子,比如我们在杭州的某个机房里有一台服务器,用VGA线接了一台显示器,用USB连接了键盘,那么这台显示器和这个键盘就是服务器的本地终端。假如我们在隔壁机房用串口线又接了一个显示器和键盘,那它们就可以称为远程终端。不管是在本地机房还是隔壁机房,因为这几个终端和服务器都是通过物理设备直接连接的,所以它们都被称为物理终端。物理终端在 Linux中被标识为 tty。它是teletype的缩写,因为在计算机早期的时候,Ken Thompson 和 Dennis Ritchie用电传打印机作为他们 Unix 服务器的终端(参考《Linux,Unix,GNU 到底有什么样的渊源?》),所以这个名字就这样被沿用了下来。
假如我们在上海的家里通过 ssh 远程登陆杭州的服务器,那么我们在家中用的设备就是服务器的远程终端,也是一个虚拟终端(因为没有与服务器在本地用物理设备连接)。虚拟终端在 Linux 中用 pts (pseudo termial slave)来标识。用 who 命令可以查看当前登陆系统的用户,以及他们所使用的终端类型。
什么是控制台
控制台(console)与终端现在已经几乎表示同一个意思了,但是在计算机发展的早期它们还是有本质区别的。最初,大型计算机(可能有几间屋子那么大)只有一个终端,被称为”控制台“,而它真的是一个控制台,就像下面这张图这样,有很多的仪表和开关,技术人员就是通过它来对计算机发出指令。那个时候计算机虽然很大,但每次只能有一个人来操作,并且一次也只能运行一个程序。后来Ken Thompson 和 Dennis Ritchie发明了Unix,于是操作系统可以同时运行多个程序,并且支持多个用户同时登陆。这样一来,仅有一个控制台就显得不够了。因为控制台又很贵,所以 Ken Thompson 和 Dennis Ritchie就用了相对便宜的电传打字机作为新增加的终端连接到他们的计算机上。虽然一台计算机可以连接很多个终端,但这里边只能有一个控制台,并且控制台的权限要远大于其他的终端,比如当系统发生启动错误时,只有控制台会显示错误消息,而其他终端不会;或者当系统进入单用户登陆模式时,只有通过控制台才能进行登陆,而通过其他终端没有办法登陆。所以如果用一句话来总结控制台与终端的区别,可以说控制台是计算机最早的以及权限最大的一个终端。
什么是 Shell 和 Bash
终端和主机虽然连接起来了,但是计算机还是需要一个程序才能明白我们输入的命令,这个程序就是 Shell。我们的命令就是通过终端输入到 Shell 里,再由 Shell 转换成计算机明白的指令,然后计算机才能运行。
Shell 有很多种,我们最常用的是 Bash,另外还有Csh, Ksh, Zsh等等。对于Bash,Linux的用户应该每天都在使用,这里就不再展开介绍了。
最后
控制台、终端、Shell、Bash 这些名词经常被大家混淆,虽然今天在很多场合它们经常被替换使用,大家也都明白,不过希望通过本文大家可以弄清楚它们之间的区别和联系。