apropos, whatis 和 makewhatis

作者:David Bandel

本月专栏着眼于三个非常有用的相关命令:aproposwhatismakewhatis。要理解为什么这些命令如此有价值,理解 Unix(包括 Linux)不断演进版本背后的基本哲学会有所帮助。该哲学仍然是创建小型、便携、专门化的程序,这些程序可以出色地执行一项任务,并且可以接收来自其他程序的输入并将输出重定向到其他程序。

这种哲学催生了大量小型、强大但功能极其有限的程序。只需列出 /usr/bin 目录,您就会明白我的意思。而且这还不是全部。您可以坐下来运行每个程序,看看它们是做什么的。或者您可以开始阅读数百个可用的 man pages,其中描述了这些命令。无论您使用哪种方法来学习这些命令,最终,您仍然可能会因为数量庞大而忘记大多数命令。那么,您如何知道数百个可用程序中的哪一个可以为您完成工作?或者哪些命令最适合您的特定需求?apropos 和 whatis 应运而生。

Apropos,正如字典所定义,意思是“恰当的;相关的;适合场合的,尽管不严格属于正在考虑的主题”。这些定义,特别是最后一个,完全是 apropos 的含义。apropos 将根据关键词搜索列出程序,并附带每个程序的一行概要。whatis 与之类似,但限制更多;即,实际的命令作为参数给出,而不是关键词,因此输出更少。

makewhatis

在我们了解 apropos 如何帮助我们之前,我们需要确保 apropos 使用的 database 存在且是最新的。输入 makewhatis。此命令创建 whatis database 文件,供 apropos 和 whatis 使用。它们位于每个 ../man 目录中,并编目每个 cat? 和 man? 子目录中的 manual 文件。

要创建 whatis database 文件,您需要以 root user 身份调用 makewhatis。Non-privileged users 通常在 ../man 目录中没有写入权限来创建 whatis database 文件。关于 makewhatis 性质的第二个线索是它的位置。makewhatis 通常位于 /usr/sbin 子目录中,表明其被归类为 system administration program。通常,只有 root 的 PATH environment variable 包含 sbin 目录。makewhatis 可以由 root 的 crontab file 调用并定期运行,如果它还不存在,您可能希望将其包含在内。但这超出了本文的范围。如果您只能以 non-privileged user 身份登录,或者确定您的 whatis database 文件存在,您可能需要跳到下一节。如果您开始看到 <keyword>: nothing appropriate,您需要让您的 system administrator 运行 makewhatis。

首次运行 makewhatis 将需要几分钟时间,请耐心等待(去喝杯咖啡)。单独运行 makewhatis 将在 /usr/man 中创建 whatis database 文件。为确保所有 man 位置都被编目,请使用 -w switch。这将读取文件 /etc/man.config 并使用其指定的 man paths。或者,您可以在 -w switch 后添加路径,这些路径也将被使用。如果您想知道哪些路径将被编目,请键入 man --path,您将看到 /etc/man.config 认为您的 manuals 在哪里。如果您有其他路径,则应将其添加到您的 man.config 文件中。

makewhatis 的另一个 option 是 -c。此 switch 单独使用时,将仅编目 man.config 中列出的 ../man/cat 条目。其他 cat 子目录可以在 -c switch 后添加,它们也将被编目。

但是,您可能只想使用新添加的命令更新 whatis databases。使用 -u switch 来更新 database 文件。此 switch 读取 whatis database 文件的时间,并添加自那时以来创建或更新的 manual pages。

如果您想知道 makewhatis 在做什么,请添加 -v switch,您将看到输入的每个 man 目录以及添加到列表中的每个命令。与 makewhatis 一起使用的每个 switch 都应以空格分隔,并以连字符开头;这些 switches 不能组合使用。makewhatis 确实有一个弱点:如果您的 system 没有足够的 RAM 和 virtual memory,makewhatis 将会失败。如果您收到错误消息——并且您以 root 身份运行 makewhatis——请添加更多 swap space 并重试。

使用 apropos

要在您的 system 上搜索 whatis database,只需键入

apropos \keyword

将您的 criteria 作为搜索的 keyword 插入。让我们试一个。我从未使用过我的 CD-ROM player 做任何事情,除了挂载 data disk 和访问文件,但我想在工作时(或玩 xtetris,因为它没有音乐伴奏等)播放一些音乐。所以我输入

apropos cdrom

然后我看到

xplaycd (1)          - X based audio cd player for cdrom drives (END)

apropos 使用 less pager,除非您的 PAGER environment variable 另有说明。要退出此屏幕,请按 q。要滚动,请使用向上和向下箭头键,或空格键一次向下滚动一屏。

现在我不确定,但我相信我的 system 上存在其他用于访问 CD 的程序。是的,这会起作用,但是选择呢?让我们再试一次。这次,我将只尝试 CD

apropos cd

调查显示

Tcl_AsyncCreate, Tcl_AsyncMark, Tcl_AsyncInvoke, Tcl_AsyncDelete
(3) - handle asynchronous events
cd (3)              - Change working directory
curs_window: newwin, delwin, mvwin, subwin, derwin, mvderwin,
dupwin, wsyncup, syncok, wcursyncup, wsyncdown (3) - create curses
windows
eject (1)           - eject CD-ROM disc from drive
mcd (1)             - change MSDOS directory
rexecd (8)          - remote execution server
termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush,
tcflow, cfgetospeed, cfget
ispeed, cfsetispeed, cfsetospeed, tcgetpgrp, tcsetpgrp (2)
               - get and set terminal attrib
utes, line control, get and set baud rate, get and set terminal
foreground process group ID
tin, rtin, cdtin, tind (1) - A Netnews reader
cda (1)              Compact disc digital audio player utility
wm2xmcd (1)         - workman-to-xmcd CD database file converter
xmcd (1)            - CD digital audio player utility for X11/Motif
xplaycd (1)         - X based audio cd player for cdrom drives

现在我们遇到了一个问题。我们可能会被不相关的项目淹没。如果这没有给您一个长列表,请尝试将 cat 作为 apropos 的 keyword。您将获得多页输出。(请继续阅读以了解原因。)

如果您查看,您可以看到我们得到了我们想要的,以及更多。我们如何缩小范围?我们可以在 apropos 命令行上放置两个 keywords 吗?可以。不幸的是,这些 keywords 是 logical ORed 而不是 ANDed 在一起,这使得输出更长。但是,如果我们扫描列表,似乎我们感兴趣的大多数命令都包含术语 audio。我们可以尝试 "apropos audio"。但是,让我们改为搜索之前的列表。输入

apropos cd | grep -i audio

我们的回报

cda (1)  - Compact disc digital audio player
utility xmcd (1 - CD digital audio player utility
for X11/Motif xplaycd (1)     - X based audio cd
player for cdrom drives

现在,这更像样了!我们可以尝试这些程序,看看我们最喜欢哪个。而且我们知道它们有 manual pages 来帮助我们。

读者可以做一个很好的练习,即使用“mail”作为 keyword(这将返回一个很长的列表),然后 grep 该列表以查找 audio,看看哪些程序可能帮助您通过电子邮件发送 sound files。

apropos 存在一个不太明显但相同的命令。命令 man -k <keyword> 是同义的,尽管不如前者容易记忆。

whatis

最后,让我们看一下 whatis。在 apropos(也称为 man -k)搜索期间,我们一直在访问 whatis database 文件。让我们尝试使用 whatis 进行 cd 搜索。

whatis cd

现在我们得到

cd (3)               - Change working directory

那么有什么区别呢?为什么只有一个条目?将 whatis database 视为列式结构,包含两列。左列包含程序名称(用于调用程序的 command),右侧包含 manual 的程序 synopsis 的第一行。apropos 使用 keyword 作为 regular expression 搜索两列,以查找 keyword 的所有出现项。这些出现项可能嵌入在 command 词或 synopsis 的词中。例如,apropos cat 返回包含单词 catalog、category、duplicate、application 等的行。另一方面,whatis 仅搜索左手列,其中仅包含程序名称。如果您知道 command 的名称,但不知道其功能,则此功能很有用。

缺点

这些 commands 确实有局限性。如果一个 command 没有相应的 manual page,它将不会在 database 中列出。makewhatis 不包含 manual page,至少在作者的 system 上是这样。如果 synopsis 不包含您选择搜索的 keyword,它将不会显示出来。与所有工具一样,您可能需要比较几个不同搜索的结果或 grep 长搜索结果,以找到最适合您需求的程序。

总结

现在您拥有了帮助查找您可能不经常使用但值得了解的 commands 的工具。使用 apropos 和 whatis 肯定比通读所有 manual pages 要好得多。Linux 的新手会发现 dir keyword 在目录操作方面有很多帮助。因此,开始使用 apropos 进行搜索和学习吧!

David Bandel (dbandel@ix.netcom.com) 是一位计算机网络顾问,专门研究 Linux,但也勉强使用 Windows 和那些“真正的”Unix 系统,如 DEC 5000 和 Suns。当他不工作时,他可能会在破解自己的 system,或者在飞机上从 2,500 英尺的高空欣赏西雅图的景色。他欢迎您的评论、批评、俏皮话,并很乐意进一步混淆问题。

加载 Disqus 评论