所有的计算机,都可以看作由两个部分组成--运算组件,输入输出.
运算组件负责进行运算,而输入输出组件负责读入运算所需的数据或者呈现运算的结果.一般我们能看到的计算机的一些部分比如显示器,键盘鼠标,音响,其实都只是输入输出组件.而运算组件都被裹在机箱里.
为了读写不同来源,载于不同介质的信息,就需要不同的输入输出设备.比如读写光盘的光驱/刻录机,显示图像的显示器,扫描文件的扫描仪,录制声音的话筒,拍摄图像的摄像头,甚至网络接口也算一种输入输出设备.
在众多的读写设备中,有一类是专门为了和人进行交互的.比如键盘,虽然打字输入的速度远远达不到USB口传输数据的极限,但是这种设备是转为人输入设计的.再比如音响.如果一台计算机旁经常没有人听音乐,那么是没有必要配备音响的.
这类设备组合起来所承担的功能叫做'人机交互'.它们把计算机内部信息传达给人,也从人那里接收需要传入计算机内部的信息.
为了适应不同的应用情景,可能采用不同的人机交互方案.比如家用台式机和笔记本就用经典的键盘鼠标加显示器,强调便携性的智能手机和平板电脑则采用触摸屏.
对于突出运算能力和数据吞吐量的服务器级别的计算机来说,多媒体输入输出不是它的首要任务.它不需要音响,不需要摄像头和话筒,甚至不需要鼠标.只需要在计算机和操作员之间建立一条简单,但是准确可靠的通信桥梁就可以.
根据人类这么多年发展经验的总结.文字就是最好的交流方式.所以人和电脑之间有一个可以显示文字的显示器,有一个可以打字的键盘就足以.
在计算机发展的早期阶段,甚至没有彩色的可以显示清晰图片的显示器可以用.显示器被简化成了一种只能显示固定行列数,固定字体,固定大小文字的荧光屏.再加上键盘,就组成了所谓的终端机.终端机本身没什么运算能力,它一般通过一根缆线连接到计算机主机上.操作员和计算机通过终端机交流,感觉就像是用纸笔一样方便.下图就是一款当时非常流行的终端机VT100.
图1:VT100终端机(来源:VT100在线用户手册)
这台终端机的键盘可以完成英文和数字的输入,屏幕可以显示80列乘24行的英文字母或者数字字符。你可能没有机会收藏这么一台1978年的老古董,但是你却可以在几乎任何计算机上找到它的影子——虚拟终端。
虚拟终端是用一个窗口来模拟早先终端机的功能。要是类比的话就相当于在电脑上用模拟器玩红白机游戏。早先的终端机给虚拟终端留下的印记非常多,除了黑底白字的默认配色,80列25行(或24行)的默认显示大小这些一眼能看出来的以外。适用于终端机的ANSI控制码等命令也大都可以用于虚拟终端。
虚拟终端也不再需要真的拉一根缆线从服务器接到你的显示器上.很多情况下我们会用一台笔记本或者微型台式机通过网络连接到目标服务器然后打开其虚拟终端.
另外,想要详细了解终端机的使用方法,可以参考VT100手册。完整的VT100用户手册可以在网上免费下载。
虚拟终端是图形化界面下模拟早期终端的软件.虚拟终端和实体终端机的关系就像汽车和赛车游戏.
而shell类软件是一类负责人机交互的软件(有了显示器和键盘,总得有软件控制显示器显示点什么,并且根据键盘事件做出反应吧).一般来说shell分为两类:最为基本的命令行式Shell(CLI Shell)和更直观更容易上手的图形化Shell(GUI Shell).
而CLI Shell(在不引起混淆的情况下,我们就把CLI Shell简称为shell)就是一种可以在终端中运行的人机交互软件.它的基本工作就是读取一行命令输入,执行,然后把结果输出出去.在最初它肯定是运行于实体终端机上.但是由于现在很难找到能用的终端机了,我们一般都在虚拟终端中执行shell软件.
不把这两类软件分清楚有的东西就很难讲清楚.比如虚拟终端中的字体一般是虚拟终端控制的.你在bash里找不到调字体和字号的内置命令.而命令自动补全这种功能则需要shell软件或者其插件完成,虚拟终端不可能给你做自动补全.有的快捷键和复制粘贴功能这些就比较复杂,因为虚拟终端和shell软件都会提供一些快捷键以及复制粘贴功能.不过想要搞清一个快捷键到底是哪个软件设置的也不是没办法.去你用的虚拟终端以及shell的官网查一下文档就清楚了.(我想最复杂的就是GUI Shell,虚拟终端以及虚拟终端里跑着的CLI Shell程序三者的快捷键冲突.)
至于为什么专门负责人机交互的软件叫shell,我想大概是因为操作系统中专门负责进程调度,内存管理之类'内部事务'的部分叫做kernel吧.
bash是一款CLI Shell软件.它是最普遍最常用的shell.以至于很多情况下,我们一说Linux上的shell,基本就是指bash.另外它也是标准.如果你写的shell脚本不兼容于bash的脚本语法会是一个非常麻烦的事情.但是,bash并不是最好用的shell.所以如果是shell重度用户.我推荐还是尝试一下zsh之类的工具.
这个系列的后续文章将会对bash做一个大概的介绍.但是不会深入bash脚本编程等领域.感兴趣的话可以读bash的参考手册或者专门的Linux命令行教程:
- <<Linux命令行大全>>
- <<Linux命令行与shell脚本编程大全>>
个人来讲,其实并不推荐非服务器管理员深究bash脚本的问题.原因很简单,语法设计缺陷,写起来全是坑,非常麻烦.如果一定要实现带一些逻辑功能的脚本可以考虑用Python或者Lua之类的脚本替换.如果遇到需要执行bash命令的时候调用它们的系统接口函数就可以.比如Lua的os.execute和Python的os.system.