Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1694011
  • 博文数量: 177
  • 博客积分: 9416
  • 博客等级: 中将
  • 技术积分: 2513
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-06 16:08
文章分类

全部博文(177)

文章存档

2013年(4)

2012年(13)

2011年(9)

2010年(71)

2009年(12)

2008年(11)

2007年(32)

2006年(25)

分类: BSD

2007-09-04 13:20:43

第八章 csh, pipes和find
强有力的工具给强有力的傻瓜


“有些操作系统从没有被好好计划,以至于只好用反刍的噪音来命名它的命令(awk,
grep, fsck, norff),我想到这个就反胃。”
—— 无名氏

UNIX所谓的“强大工具”是个骗局。 这不过是UNIX为了那些东拼西凑的命令和工具所打
的幌子。真正的强大工具不需要用户付出太多努力就能提供强大的功能。任何会使改锥
和钻头的人都会用电动改锥和电钻。他们不需要搞懂电学、电机、转矩、电磁学、散热
或维护。他们只需要把它通上电,带上安全眼镜,然后打开开关。许多人连安全眼镜也
不省了。你在五金商店里找不到有致命缺陷的工具:它们不是根本没能投放市场,就是
被诉讼搞得焦头烂额。

UNIX设计者的最初目标是提供简单的工具,然而现在的工具则充满了过分的设计和臃肿
的功能。比如ls这个列文件的命令竟然有18个选项,提供从排序到指定显示列数的种种
功能,而这些功能如果用其他程序实现会更好些(以前正是这样的)。Find命令除了查
找文件以外还输出cpio格式的文件(而这个功能其实用UNIX名声狼藉的管道很好地实现
)。今天,和UNIX类似的电钻将有20个旋钮,连着不标准的电源线,不匹配3/8英寸和7/
8英寸的钻头(而这一点会在手册的BUG一章中说明)。

和五金店里的工具不同,许多UNIX强大工具是有缺陷的(有时对文件是致命的):比如t
ar的不接受超过100个字符的文件名;又比如UNIX调试器总是垮掉,这还不够,它的core
文件将覆盖你自己的core,让你下次可以用调试器去调试调试器在调试调试器中生成的c
ore。


Shell游戏

UNIX的发明人有个伟大的想法: 把命令解析器作为一个用户程序实现。如果用户不喜欢
缺省的命令解析器,他可以自己写一个。更重要的是,shell能够进化,这样shell将不
断进步,变得越来越强大,灵活和易用,至少理论上是这样。

这真是个伟大的想法,不过弄巧成拙了。功能的逐渐增加带来的是一团糟。因为这些功
能没有经过设计,只是在不断演化。和所有编程语言所遭到过的诅咒一样,那些利用这
些功能的既存shell脚本成为了shell的最大敌人。只要有新的功能加入shell,就会有人
在自己的脚本中使用它,这样这个功能就从此长生不老了。坏主意和臭功能往往怎么也
死不掉。

于是,你得到了一个不完整、不兼容的shell的大杂烩 (以下每个shell的描述都来自于
他们各自的man pages):

sh 是个命令编程语言,用于执行来自终端或文件的命令。

Jsh 和sh一样,但具有csh风味的工作控制 (job control)

Csh C类型语法的shell

Tcsh emacs编辑口味的csh

Ksh KornShell,你的另一个命令和编程语言

Zsh Z Shell

Bash GUN Bourne-Again Shell (GNU Bourne复出Shell)


五金商店里的螺丝刀和锯子,尽管可能来自3、4个不同的厂商,但操作方法都差不多。
典型的UNIX在/bin或/usr/bin下存了成百个程序,它们来自众多自以为是的程序员,有
着自己的语法、操作范例、使用规则(这一个可以当成管道,而那一个则操作临时文件
),不同的命令行参数习惯,以及不同的限制。拿grep和它的变种fgrep, egrep来说,
哪一个是最快的?为什么它们接受的参数都不一样,甚至对正则表达式的理解也不尽相
同?为什么不能有一个程序提供所有功能?负责的家伙在哪儿啊?

当把命令之间的种种不同都深深烙在脑海中后,你还不能避免被惊着。

Shell Crash

下面这条消息来自哥伦比亚大学编译原理课程的BBS。

Subject: Relevant UNIX bug
October 11, 1991

W4115x课程的同学们:
我们刚学习了活动记录(activation record),参数传递(argument passing)和函数调用
规则(calling conventions),你们是否知道下面的输入将让任何一个cshell立刻崩溃?

!xxx%s%s%s%s%s%s%s%s

你们知道为什么么?

以下的问题供你们思考:

Shell遇到 “!xxx”会做什么?
Shell遇到 “!xxx%s%s%s%s%s%s%s%s”会做什么?
为什么cshell会崩溃?
你将如何修改有关代码来解决这个问题?


最重要的一点:

当你(是的,就是你)将这个前途远大的操作系统用21个字符治服的时候,你觉得天理能
容么?


你可以自己试一试。根据UNIX的设计,如果shell垮掉了,你的所有进程将被杀死,你也
会被踢出系统。其他操作系统在遇到非法内存访问错误时会弹出调试器,但不是UNIX。


可能这就是为什么UNIX shells不让你在shell的地址空间里动态加载自己的模块,或者
直接调用其他程序中的函数。如果这样就太危险了。一步走错,唉哟,你已经被踢出门
外了。愚蠢的用户是应该被惩罚的,程序员的错误更是不可容忍。


下回书里我们将进入色彩斑斓的UNIX语法世界。


阅读(1715) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~