2006年12月8日星期五

玩转fortune

fortune是一个非常简单的小程序,几乎存在于所有的unix、bsd、linux操作系统上,它的功能很简单,就是从数据库中随机返回一句话。这个数据库一般是前辈们都设计好了的,也并没有我们常用的关系型数据库那么复杂,一般情况下忽视他们的存在就是了。要使用fortune,在shell中执行就可以了,比如:
$ fortune
Q: Do you know what the death rate around here is?
A: One per person.

很显然这是一个类似脑筋急转弯的问题。fortune有一些参数可以选用,比如:

$ fortune -c
(fortunes)
%
Never be led astray onto the path of virtue.

-c参数让你知道随机的句子出自哪个文件/或者叫数据库,本例中就是fortunes了。并且,在我使用的ubuntu dapper中,这些数据文件都存储在/usr/share/games/fortune中:

$ ls /usr/share/games/fortunes/
fortunes fortunes.u8 literature.dat riddles riddles.u8
fortunes.dat literature literature.u8 riddles.dat

看来很多人都把fortune当作一个小"游戏"呢。如果想知道fortune都会从哪些文件中随机挑选句子,可以这样:

$ fortune -f
100.00% /usr/share/games/fortunes
52.24% fortunes
31.76% literature
16.00% riddles

-f参数列出fortune所用的所有数据文件,以及他们在随机选取句子过程中的权重。一般这个权重或者比例是按照各个文件中的句子总数来分配的,可以看到ubuntu只带了三个数据文件:fortunes预言,literature名句,riddles谜语。fortune也可以控制每个数据文件的权重大小,比如-e参数让大家平均比例,或者在每个数据文件前面加上百分比:

$ fortune -f 20% fortunes 30% literature riddles
30.00% /usr/share/games/fortunes/literature
20.00% /usr/share/games/fortunes/fortunes
50.00% /usr/share/games/fortunes/riddles

可以看到比例就随之调整了,当然比例只和要等于100%,不过也可以省略riddles前面的百分比,那么它就是100%减去其他文件所占比例之和。还有其他一些参数可以用,比如:

先用-n指定一个句子长度,然后用-l只返回比这个长的,或者用-s只返回比这个短的。
-m regxp返回符合正则表达式的句子
-i在使用-m参数的时候忽略大小写
-o只返回具有攻击性的句子(不建议在网上对他人使用)
-a在所有句子中随机选择,包括具有攻击性或者不具有的。
-w 程序结束前等待一段时间,如果每次关机之前来一下,可以让你有时间来阅读

除了系统给定的那些数据文件之外,我们当然想自己创建啦,这个就要用到strfile命令了,首先来创建一个数据文件test:

test1
%
test2
%
test3

句子可以是多行,句子之间用独占一行的字符%来分割,然后用strfile为test创建索引文件,就可以在fortune中使用了:

$ strfile test
"test.dat" created
There were 3 strings
Longest string: 7 bytes
Shortest string: 6 bytes

$ fortune test
test3

注意如果不使用strfile创建索引,数据是不会被索引到的,所以要在新建和每次更新数据文件之后重新创建索引。

用法就介绍到这里,那么fortune有什么用呢?这就要看用户们怎么发挥了,比如我想在mutt的签名中随机附上一个脑筋急转弯,或者为网站生成"每日技巧"等等都可以,nix下的工具就是这样,只作一件事,并且作到最好,然后由用户来自由组合。

谁有兴趣把唐诗宋词弄进来玩玩?

Source:http://www.fwolf.com/blog/post/264