You are here

Drupal专业开发指南 第21章 使用egrep来查找代码

egrep是一个Unix命令,用来在文件中搜索匹配给定正则表达式的位置。不,它不是一个鸟儿(那是egret(白鹭))。如果你是一个Windows用户,并想学习一下这些例子,你可以先安装一个预编译的版本(参看http://unxutils.sourceforge.net)或者安装Cygwin环境(http://cygwin.com),这样就可以使用egrep了。否则,你只能使用操作系统内置的搜索功能,而不能使用egrep。

    当你需要在Drupal核心中查找钩子实现时,当查找错误消息生成的位置时,以及其它一些情况时,egrep都是一个很方便的工具。让我们看一些例子,这里在Drupal根目录下使用egrep:
 
$ egrep -rl 'hook_init' .
./includes/bootstrap.inc
./includes/path.inc
./modules/aggregator/aggregator.module
./modules/book/book.module
./modules/forum/forum.module
./modules/node/node.module
./modules/poll/poll.module
./modules/system/system.module
./update.php
 
    在前面的情况中,我们在Drupal文件中从当前目录(.)递归的搜索(-r)包含hook_init的实例,并将匹配实例的文件名打印出来(-l)。现在看下面的例子:
 
$ egrep -rn 'hook_init' .
./includes/bootstrap.inc:1011: // Initialize $_GET['q'] prior to loading
modules and invoking hook_init().
./includes/path.inc:9: * to use them in hook_init() or hook exit() can make
them available, by
./modules/aggregator/aggregator.module:261: * Implementation of hook_init().
./modules/book/book.module:164: * Implementation of hook_init(). Adds the
book module's CSS.
./modules/forum/forum.module:160: * Implementation of hook_init().
./modules/node/node.module:1596: * Implementation of hook_init().
./modules/poll/poll.module:24: * Implementation of hook_init().
./modules/system/system.module:538: * Implementation of hook_init().
./update.php:18: * operations, such as hook_init() and hook_exit() invokes,
css/js preprocessing
 
    这里,我们在我们Drupal文件中,递归的(-r)搜索带有字符串“hook_init”的实例,并将它们出现的位置以及行号(-n)打印出来。我们可以进一步的提炼搜索结果。在下面的这个例子中,我们在前面例子的搜索结果集的基础上,进一步的搜索单词“poll”出现的情况:
 
$ egrep -rn 'hook_init' . | egrep 'poll'
./modules/poll/poll.module:24: * Implementation of hook_init().
 
    提炼你的搜索的另一种方式,就是为egrep使用-v标记,它意味着“反转这个匹配”,也就是说,不匹配该字符串的就是所要匹配的。让我们查找单词“lock”出现的所有地方,同时排除单词block或Block的情景:
 
$ egrep -rn 'lock' . | egrep -v '[B|b]lock'
./includes/common.inc:2548: // See if the semaphore is still locked.
./includes/database.mysql.inc:327:function db_lock_table($table) {
./includes/database.mysql.inc:332: * Unlock all locked tables.
...
 老葛的Drupal培训班 Think in Drupal

Drupal版本: