今天不小心在freenode上发个问题,牛人一句"Read The Fucking Manual!"顶了回来,只得乖乖RTFM..一直就听说man命令很强大,却仅仅用了其中一丁点功能,有点暴殄天物的感觉.

下面以编写who命令为例,记一下man的用法,做个备忘.

首先需要知道who命令可以干些什么:

arthur@arthur-desktop:~$ who

who命令输出了一堆东西,根据输出大概可以猜到who的作用了,显示关于当前在本地系统上的所有用户的信息..接下来看一下who的手册:

arthur@arthur-desktop:~$ man who

又是一个把终端淹没的信息流,仔细看下,其中的NAME部分包含命令的名字以及命令的简短说明.DESCRIPTION部分是关于命令功能的详细阐述.在DESCRITION的最后,我们看见了这么一条信息:

...If FILE is not specified, use /var/run/utmp.  /var/log/wtmp as FILE  is common....

上述描述说明,已登录的用户信息是存放在/var/run/utmp中的,who通过该文件获得具体信息.不妨看看这个文件的结构信息,这可以用man -k来实现,它根据关键字在联机文档中搜索:

arthur@arthur-desktop:~$ man -k tmp

输出很多,其中有这么一条是值得我们注意的:

arthur@arthur-desktop:~$ man -k utmp
utmp (5)             - login records

其中,5是小节编号,说明该文档是在第5节,继续查看utmp,注意别把小节编号漏了:

arthur@arthur-desktop:~$ man 5 utmp

这次终于搜索得差不多了,第5节中utmp的帮助文档写得足够充分,值得注意的是SYNOPSIS,它注明了utmp的头文件(#include <utmp.h>),假如对其有兴趣,我们可以打开它仔细读读组织结构,文件位置可以从utmp的帮助文档FILES部分得到:

arthur@arthur-desktop:~$ more /usr/include/utmp.h

接下来重新分析who的输出,查一下资料,很容易知道who中有两件事是需要做的:

  1. 从文件中读取数据结构
  2. 将结构中的信息以合适的形式显示出来

这就有了一个问题,既然是读取文件,那么肯定需要用到read,查看其帮助文档:

arthur@arthur-desktop:~$ man read

其中,又可以看到write,open等系统调用,就这样,把who ,utmp,open,read,write等帮助文档看完,就可以自己写一个who命令了..

PS: 其实通常是这样做的,先猜测utmp需要的系统调用,然后过滤man的帮助文档.. 如man 5 utmp | grep read,不然累死了..