- Unix 简史
UNIX 最初是由贝尔实验室(Bell Telephone Laborataries)的计算机科学研究中心开发的,第一版诞生于1970年--也就是在贝尔实验室退出Multics项目不久.在 UNIX 广受欢迎的功能中,有许多便是来自Multics 操作系统.
它有下列优势:
- 系统由用户自行开发.他们使用这套系统来解决每天遇到的计算问题.
- 研究人员不受拘束地进行试验,必要时也可以任意变换程序.
- 贝尔实验室的研究人员都是计算机科学家,他们所涉及的系统不单单自己使用,也分享给同事们---这些人也是计算机科学家,因此衍生出"务实"的设计模式:程序会执行你所赋予的任务,但不会和你进行对话,也不会问你一堆"你确定吗?"之类的问题.
- 除了精益求精,在设计和问题解决上他们不断地追求"优雅".关于"优雅"有一个贴切的定义:简单就是力量(power cloaked in simplicity).
也因此存在如下缺陷:
- 工具程序之间存在许多不一致的地方.
- 组多工具程序有缺陷.
- 有时程序并未经过彻底测试,这使他们在执行的时候一不小心就会遭到破坏.
- 系统的文档尽管大致上内容完备,但极为简单,是的用户在学习的时候很难找到所需要的信息.
2.软件工具的原则
- 一次做好一件事情
很多时候这都是最重要的原则,若程序只做一件事情,那么无论是设计,编写,调试,维护,以及生成文件都容易的多.
- 处理文本行,不要处理二进制数据
文本行是 UNIX 的通用格式.它可以用任何唾手可得的文本编辑器来编辑它,也可以让这些数据在网络和各种机器架构之间传输.舒勇该文本文件更有助于任何自定义工具与现存的 UNIX 程序之间的结合.
- 使用正则表达式
正则表达式(regular expression)是很强的文本处理机制.了解它的运作模式并加以实用可以湿度简化编写命令脚本的工作.
- 默认使用标准输入/输出
在未指明指定文件名的情况下,程序默认会从它的标准输入读取数据,将数据写到它的标准输出,至于错位信息则会传送到标准错误输出.以这样的方式来编写程序可以轻松地让它们成为数据过滤器.
- 避免喋喋不休
软件工具的执行过程不该像"聊天"(chatty).不要将"开始处理"(starting processing),"即将完成"(almost done)或"处理完成"(finished processing)这类信息放在程序的标准输出中(至少这不该是默认状态).
3.shell脚本的目标使用情景
shell 脚本最长用于系统管理工作,或是用于结合现有的程序以完成小型的,特定的工作.一旦你找出完成工作的方法,把命令串在一起,放进一个独立的程序或者脚本里面,此后只需要执行该程序便能完成工作. 如果你写的程序很有用,替他人可以利用该程序当做一个黑盒来使用,它使一个可以完成工作的程序,但我们不必知道它如何完成的.
4. 脚本编程语言和编译型语言的差距
许多大中型程序都是用编译型语言写成的,例如 Paxcal,C,C++或 Java.这类程序只要从源代码(source code)转换成目标代码(object code),便能直接通过计算机来执行.编译型语言的好处是高效,缺点是:他们多半运作与底层,所处理的字节整数浮点数或者其他机器层级的对象.
脚本编程语言通常是解释型(interpreted)的,这类程序的执行,是由解释器(interprete r)读入程序代码,并将其转换成内部的形式,再执行.注意:解释器本身是一般的编译型程序.
使用脚本编程语言的好处是,他们多半运行在比编译型语言还高的层级,能能够情已处理文件和目录之类的对象.缺点是:他们的效率通常不如编译型语言.不过权衡之下,通常使用脚本编程还是值得的:花1个小时写成的简单脚本,同样的功能用 C 或 C++来编写实现可能需要两天,而且一般来说脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题.
shell 似乎是各 UNIX 系统之间通用的功能,并且经过了 POSIX 的标准化,因此 shell 脚本只要"用心写"一次,即可应用在各个系统上.因此,使用 shell 脚本是基于:
- 简单性
- 可移植性
- 开发容易