如何使用 man page

Linux 系统下命令繁多,每个命令又有不同的使用参数。要记住所有命令的使用方式不太现实,因为实在是太多了,而且大多数平常还用不到,即使一时记住了也会很快忘记。实际上工作时经常用到的命令很少,比如 ls、cd、tail、tar、top、ps 等等,用的多了自然就记住了。

有时候为了排查问题需要用到一些不常用的命令,一时想不起来怎么用也是很苦恼。通常的做法是到搜索引擎里搜索一下,找篇文章对照着操作即可。除此之外还可以通过 man page 查看命令的使用方法,说不定还能发现一些高级的用法。man page 并非是「男人的页面」,它的全称是 manual page,可以直译为「手册页面」,是 linux 或 unix 环境下各种命令和函数的帮助文档。

why

如何查看命令的 man page

使用 man 命令 查看指定命令的 man page,比如要查看 ln 命令的 man page 可以输入 man ln

如下是 mac 系统下 ln 命令的 man page,为方便查看对其进行了简化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
LN(1)                     BSD General Commands Manual                    LN(1)

NAME
link, ln -- make links

SYNOPSIS
ln [-Ffhinsv] source_file [target_file]
...
DESCRIPTION
The ln utility creates a new directory entry (linked file) which has the same modes
as the original file.

...

The options are as follows:

-F If the target file already exists and is a directory, then remove it so that
the link may occur. The -F option should be used with either -f or -i options.
If none is specified, -f is implied. The -F option is a no-op unless -s option
is specified.

...

COMPATIBILITY
The -h, -i, -n and -v options are non-standard and their use in scripts is not recom-
mended. They are provided solely for compatibility with other ln implementations.

The -F option is FreeBSD extention and should not be used in portable scripts.

SEE ALSO
link(2), lstat(2), readlink(2), stat(2), symlink(2), symlink(7)

STANDARDS
The ln utility conforms to IEEE Std 1003.2-1992 (``POSIX.2'').

The simplified link command conforms to Version 2 of the Single UNIX Specification
(``SUSv2'').

HISTORY
An ln command appeared in Version 1 AT&T UNIX.

BSD February 14, 2006 BSD

各个描述项的含义

man page 通常会介绍命令的语法,然后详细介绍每个参数的含义和用法,最后一般会给出关联的命令。除了这些,部分命令的 man page 还会有一些特定的描述项,比如 EXAMPLES(示例)、ENVIRONMENT(环境)等。

下面通过 ln 的 man page 说明下每一项内容的含义

LN(1) - 命令

如下这一行表示这是一个 BSD 通用命令的帮助手册,其中 1 表示在 shell 环境中的可执行命令或文件

1
LN(1)                     BSD General Commands Manual                    LN(1)

其他的数字表示的含义如下

数字说明
1在 shell 环境中的可执行命令或文件
2系统核心可调用的函数与工具等
3一些常用的函数(function)、函数库(library),大部分为C的函数库(libc)
4设备文件的说明,通常是在 /dev 下的文件
5配置文件或者是某些文件的格式
6游戏(games)
7惯例与协议等,例如 Linux 文件系统、网络协议、ASCII code等等的说明
8系统管理员可用的管理命令
9跟kernel有关的文件

NAME - 名字

这是命令的名字。可以看出 linkln 是同一个命令的两个名字。

1
2
NAME
link, ln -- make links

SYNOPSIS - 语法

这是命令的语法说明。其中 [] 内的是可选参数。

1
2
3
SYNOPSIS
ln [-Ffhinsv] source_file [target_file]
...

DESCRIPTION - 详细说明

这是命令的详细说明。不仅介绍了命令的功能,还对命令的每一个参数做了详细的解释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DESCRIPTION
The ln utility creates a new directory entry (linked file) which has the same modes
as the original file.

...

The options are as follows:

-F If the target file already exists and is a directory, then remove it so that
the link may occur. The -F option should be used with either -f or -i options.
If none is specified, -f is implied. The -F option is a no-op unless -s option
is specified.

...

COMPATIBILITY - 兼容性

这是对命令的兼容性说明,比如一些参数只有在特定的环境下才能生效。在编写可移植的脚本时需要考虑参数的兼容性。

1
2
3
4
5
COMPATIBILITY
The -h, -i, -n and -v options are non-standard and their use in scripts is not recom-
mended. They are provided solely for compatibility with other ln implementations.

The -F option is FreeBSD extention and should not be used in portable scripts.

SEE ALSO - 查看其它

这里给出了一些有关联的命令。

1
2
SEE ALSO
link(2), lstat(2), readlink(2), stat(2), symlink(2), symlink(7)

STANDARDS - 标准化

这是对命令标准化情况的说明。比如 ln 命令遵循 IEEE 1003.2-1992 标准。

1
2
3
4
5
STANDARDS
The ln utility conforms to IEEE Std 1003.2-1992 (``POSIX.2'').

The simplified link command conforms to Version 2 of the Single UNIX Specification
(``SUSv2'').

HISTORY - 历史

这是对命令的一些历史介绍。ln 命令首次出现在 AT&T UNIX 第一版中。

1
2
HISTORY
An ln command appeared in Version 1 AT&T UNIX.

BSD - 版本

最后一行是对 man page 的说明。比如这里是 ln 命令的 BSD 版本,完成时间是 2006-02-14。在查看命令的参数说明时,如果有一些参数找不到,请留意下这一行,看是不是 man page 太旧了。

1
BSD                            February 14, 2006                           BSD

如何搜索

man page 可能不止一页,要快速定位到关注的内容,需要了解一点在 man page 中搜索的技巧,如果你对 vim 比较熟悉,可以直接使用命令模式下的快捷键操作,比如翻页、搜索关键字等。

快捷键功能
空格键向下翻一页
trl + f向下翻一页
ctrl + b向上翻一页
G到第一页
g到最后一页
/string向下搜索 string 这个字符串
?string向上搜寻 string 这个字符串
n, N利用 / 或 ? 来搜寻字符串时,可以用 n 来继续搜索下一个,用 N 搜索上一个
q退出 man page

更新 man page

man page 是以文件的形式存储在系统中的,若版本较老可使用新的文件替代。大致流程如下:

  1. 打开 man page 的路径配置文件,找到 MANPATH
  2. MANPATH 中找到要替换的 man page 文件,对于可执行命令来说,文件名为 [命令] + [.] + [1],其中 1 表示「可执行命令或文件」。例如 java 命令的 man page 文件为 java.1
  3. 将 man page 文件替换为所需版本。一般可在安装包里找到

替换 java 相关命令的 man page

以替换 java 相关命令的 man page 为例,实际操作下

查看 javac 命令的 man page,更新时间是 2004 年。实际使用的是 jdk 版本为 1.8,将 jdk 提供的命令的 man page 全部替换为新版

找到路径配置

man page 的文件路径通常配置在 /etc/man.conf 文件中,打开后大约在 42 行的位置能找到如下配置

1
2
3
4
5
# Every automatically generated MANPATH includes these fields
#
MANPATH /usr/share/man
MANPATH /usr/local/share/man
MANPATH /usr/X11/man

找到配置文件

切换到 /user/share/man 目录

1
2
3
cd /usr/share/man
➜ man ls
man1 man4 man5 man6 man7 man8 man9 mann whatis

因为 javajavac 等命令是「在 shell 环境中的可执行命令或文件」,对应类型为 1,所以切换到 man1 文件夹,可以看到相关的帮助文档都在这里

1
2
3
4
5
6
7
8
9
cd man1
➜ ls | grep java
java.1
java_home.1
javac.1
javadoc.1
javah.1
javap.1
javaws.1

查看文件详情,是一个软连接,真正的文件在 /System/Library/Frameworks/JavaVM.framework/Resources/Documentation/man/ 目录下

1
2
➜ ls -l java.1
lrwxr-xr-x 1 root wheel 89 1 16 2019 java.1 -> ../../../../System/Library/Frameworks/JavaVM.framework/Resources/Documentation/man/java.1

替换文件

将整个文件夹重命名

1
sudo mv /System/Library/Frameworks/JavaVM.framework/Resources/Documentation/man /System/Library/Frameworks/JavaVM.framework/Resources/Documentation/man_bak

把当前 jdk 文件夹下的帮助文档复制过来

1
sudo cp -r /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/man/man1 /System/Library/Frameworks/JavaVM.framework/Resources/Documentation/man

查看效果

再次执行 man java ,翻到最后一行,已经是新版的帮助文档了

1
JDK 8                                  03 March 2015                               java(1)

参考

鸟哥的 Linux 私房菜