一个例子实用程序
从某种意义上,这个程序是一个可执行文件,因为对于作为过滤器来说,它决不会有任何用处。然而,它作为一个命令行实用程序却工作得非常好。
这个程序仅做一件事情。它以近乎完美的输出格式输出 /usr/include/sys/errno.h 中的 errno 行。例如:
$ errno 22
EINVAL [22]: Invalid argument
清单 2. errno 查找器
#!/bin/sh
usage() {
echo >&2 'usage: errno [numbers or error names]\n'
exit 1
}
for i
do
case '$i' in
[0-9]*)
awk '/^#define/ && $3 == ''$i'' {
for (i = 5; i < NF; i) {
foo = foo ' ' $i;
}
printf('%-22s%s\n', $2 ' [' $3 ']:', foo);
foo = ''
}' < /usr/include/sys/errno.h
;;
E*)
awk '/^#define/ && $2 == '''$i''' {
for (i = 5; i < NF; i) {
foo = foo ' ' $i;
}
printf('%-22s%s\n', $2 ' [' $3 ']:', foo);
foo = ''
}' < /usr/include/sys/errno.h
;;
*)
echo >&2 'errno: can't figure out whether '$i' is a name or a number.'
usage
;;
esac
done
这个程序通用化了吗?是的,非常理想。它同时支持数字和符号名称。另一方面,它不知道关于可能具有相同格式的其他文件的信息,比如 /usr/include/sys/signal.h。可以容易地扩展它来做到这点,但是对于这样一个便利的实用能够程序,简单地创建一个名为“signal”的拷贝来读取 signal.h,同时使用“SIG*”作为模式来匹配名称,这样会更容易。
虽然这仅比对系统头文件使用 grep 方便一小点,但是它更不容易出错。它不会因为考虑不周的参数而产生无用的结果。另一方面,如果没有从头文件中找到给定的名称或数字,它不会产生诊断信息。它也不会费心去纠正某些输入错误。而且,由于命令行实用程序从来没有打算在自动化的环境中使用,因此它的上述特性无可非议。
另一个例子可能是取消对输入排序的程序(请参阅 参考资料 以获得指向此实用程序的链接)。这相当简单;也就是读入输入文件,以某种方式存储它们,然后生成一个随机顺序来输出那些行。这是一个几乎具有无限应用前景的实用程序。编写这个实用程序也比编写排序程序容易得多;例如,您不需要指定您没有对哪些键排序,或者是您希望按字母顺序、词法顺序还是按数字顺序随机排序。棘手的部分在于读入可能非常长的行。事实上,上面提供的版本在搞欺骗;它假设所读入的行中没有空字节。纠正这个问题要困难多了,我在编写它时懒得去理会它。
结束语
如果您发现自己在重复执行某个任务,可以考虑编写一个程序来完成这个任务。如果事实证明该程序更通用化一点是合理的,那就通用化它,这样您就编写了一个实用程序。
不要在您第一次需要某个实用程序的时候设计它。要等到您具有一些经验之后才着手设计。请随意地编写一两个原型;优秀的实用程序比糟糕的实用程序更能证明所花的时间和研究工作的价值。如果原先设想的出色实用程序最终却在您编写它之后成为无用之物,不要感到遗憾。如果您发现自己对新程序的缺点感到沮丧,您只需再执行另外一个原型化阶段。如果结果证明它是无用的,不奇怪,有时会发生这样的事情。
您要寻求的是这样一个程序,它查找您的最初使用模式之外的通用应用。我编写 unsort 是因为,我希望找到一种从旧的 X11“rgb.txt”文件中获得随机颜色序列的容易途径。从那以后,我将它用于令人难以置信的大量任务中,这些任务都不是为了生成用于调试和基准排序例程的测试数据。
优秀的实用程序能够为您在所有不很理想的作品上所花的时间带来回报。要做的下一件事情是使它对其他人可用,以便他们能够试验它。也要使您失败的尝试对其他人可用,也许其他人对某个实用程序具有您所不需要的用途。更重要的是,您的失败的实用程序也许是其他某个人的原型,从而给每个人带来一个美妙的实用程序。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



