情景

互联网的高速发展给我们的工作和生活都带来了极大的便利。比如,工作中,当你在 linux 系统上,遇到一个难题,不知道用什么命令时,借助网络就可以轻松解决。

这是每个 IT 人都具备的能力了(搜索也是有方法论的,此处不做讨论)。

如果没有网络,该怎么办?或许,你还可以翻阅工具书,请教别人,等等。

但是,如果你只能借助你登录的系统本身,又该怎么办?

再或者,即便有网络,怎样更快地找到你想要的命令呢?

方案

linux 有两个命令,支持通过关键字来搜索命令。

  1. man -k
  2. apropos
$ man man
...(省略)...
-k     Equivalent to apropos.
...(省略)...

由此可见,man -k是完全等价于apropos的。

$ man apropos
NAME
       apropos - search the whatis database for strings
SYNOPSIS
       apropos keyword ...
DESCRIPTION
       apropos searches a set of database files containing short descriptions of system commands for keywords and displays the result on the standard output.
...(省略)...

由 man 手册可知,apropos 命令将在 whatis database 中查询 keyword,并把结果出来。

所以,在不借助网络的情况下,使用 apropos 可以缩小你锁定的范围,甚至直接帮助你确定命令。

实例

以曾经写过的两篇文章为例:

情景 linux—如何获取一个 UUID?

既然想要获取 UUID,那我们不妨以 UUID 来搜索一下:

$ apropos UUID
abrt-action-analyze-oops (1)  - Calculate and save UUID and duplicate hash for an oops dump directory DIR
dbus-uuidgen         (1)  - Utility to generate UUIDs
findfs               (8)  - Find a filesystem by label or UUID
uuidgen              (1)  - command-line utility to create a new UUID value

你看,文章中提到的uuidgendbus-uuidgen命令就在结果中呢。

BTW:一般情况下,apropos 的结果中只看第二列为 (1) 的命令即可。

情景 linux——获取一个进程的运行目录

由文章可知,相关的关键字有 “进程”、“运行目录” 等,所以不妨使用 process、working 等关键字尝试。

$ apropos process | fgrep "(1)"
...(省略)...
procmail             (1)  - autonomous mail processor
ps                   (1)  - report a snapshot of the current processes
pstree               (1)  - display a tree of processes
pwdx                 (1)  - report current working directory of a process
refer                (1)  - preprocess bibliographic references for groff
renice               (1)  - alter priority of running processes
skill                (1)  - send a signal or report process status
...(省略)...

pwdx 命中!根据 pwdx 的简介可知,apropos working也可以定位到它。

总结

其实,apropos 的使用包含但不局限于上面的使用场景。

在我看来,apropos 好处多多,简直就是单机版命令搜索引擎

  1. 在孤立无援(不能借助网络、请教别人、翻阅工具书的情况)时,它能给你指明方向,缩小范围。
  2. 即使有网络,当你遇到问题时,顺手就可以使用下它,有益无害。
  3. 给它一个关键字,它给你返回包含这个关键字的相关命令。比起漫无目的地学习命令,有针对性地学习命令效果会更好。
  4. 使你更加关注命令的英文描述,不仅可以帮助你精准地知道命令的含义,还无形地帮助你提高英文。
  5. 忘记了怎么拼写的命令,不妨用它来帮你锁定下范围。
  6. 以极小的成本让你增长见识。

实不相瞒,我在知道了这个命令后,经常有意无意地使用它,在有意无意中解决了许多实际问题,也在有意无意中掌握了很多极为实用的命令。

一点经验:

  1. 返回结果过多时,可以调整关键字,也可以借助 grep 和正则表达式进一步过滤。
  2. 锁定命令的范围后,结合 man 命令,效果更佳。


↙↙↙阅读原文可查看相关链接,并与作者交流