Unix工具是你的朋友
如果我即将被流放到一座孤岛上,只能从IDE和Uinx工具箱中二选一,我会毫不犹豫地选择Unix工具箱。以下这些就是为什么应该精通Unix工具的理由。
首先,IDE以特定语言为目标,而Unix工具对于任何以文本形式表现的东西都能工作。现今的开发环境中,新语言和新表示法每年都如雨后春笋般出现,学习Unix的方式是一种有着重复回报的投资。
其次,IDE只提供了它们的开发人员设想的命令,而Unix工具可以运行任何你可以想象到的任务。把它们想象成乐高的零件:你可以通过组合小的通用工具来创建自己的命令。例如,下面是一个基于文本的Cunningham特征分析的实现,是由每个文件中的分号、大括号和引号组成的序列,可以反映文件内容的很多信息:
for i in *.java; do
echo -n "$i: "
sed 's/[^"{};]//g' $i | tr -d '\n'
echo
done
另外,你学到的IDE的每个操作都是针对特定任务的,例如,在某个项目的debug构建配置中增加一步。相反的是,修炼你的Unix技能会让你处理任何任务都更高效。我就曾经使用上面的命令序列来实现一个项目在多个处理器架构下的跨平台构建。
Unix工具是在多用户的计算机只有128kB的内存的时代开发出来的。它们设计如此精巧意味着现在它们可以极其高效地处理大量数据集合。大多数工具就过滤器一样工作,每次处理一行数据,对于它们可以处理的数据量也就没有上限。你想在半TB的英文维基导出数据中搜索编辑数字?一个简单的命令
grep '<revision>' | wc –l
就会给你答案,完全不费力。如果你发现一些命令的序列很有用,可以通过使用一些强大的编程结构,比如输入数据到循环和条件语句中,很容易地将其打包到一个shell脚本中。 更令人印象深刻的是,Unix命令像管道线一样运行,比如上面那个,会自然地将负责分配到现代多核处理器的不同处理单元中。
Unix工具小而美的出发点以及开源的实现让它们变得无处不在,即便是资源受限的平台,比如我的机顶盒播放器或DSL路由器。这些设备不太可能提供一个强大的图形界面接口,但它们经常包含了工具箱程序,提供了最常用的工具。如果你在Windows上面开发,Cygwin环境可以同时以可执行形式和源代码形式提供所有可以想象到的Unix工具。
最后,如果现在没有符合你的需求的工具,扩展Unix工具的世界也很简单。只需要(以任何你青睐的语言)编写一个符合如下规则的程序:你的程序只应该处理一个单一的任务,应该从标准输入中以文本行的方式读取数据;应该以原始形式在标准输出中显示结果,不加标题或者某其它修饰;影响工具运行的参数在命令行中给出。遵循这些规则,“你就拥有了整个世界”。