摘要:引子
对 man 的各种用法做一次整理,顺便也可以当作参考手册。
man
是一个 Linux 命令行实用程序,用于显示 linux 命令、系统调用、库函数等的帮助手册。手册页,即 Manual pages,又称作 man page,是在 Unix 或 类Unix 操作系统 在线 软件文档 的一种普遍的形式。 内容包括计算机程序(包括库和系统调用),正式的标准和惯例,甚至是抽象的概念。用户可以通过执行
man
命令)调用手册页。man 手册页被设计成独立的文档,不能引用其它手册页面。这与支持超链接的 Info 文档 形成鲜明对比,GNU正在将 man 手册替换成 info 文档。
手册页的默认格式是troff,使用man宏软件包(着重展现)或mdoc宏软件包(着重语义)。可以把手册页排版成PostScript、PDF和其他各种格式进行查看或打印。
安装 man-db 提供了 man 命令,less 是 man 的默认分页器。
文章图片
man-pages 提供了 Linux man 页面的内容。
文章图片
下面是一些语言的翻译版本:
- man-pages-cs for Czech
- man-pages-de for German
- man-pages-zh_cn for Simplified Chinese
- man-pages-zh_tw for Traditional Chinese
- GNOME Help — GNOME 帮助阅读程序。 通过
yelp man:
或Ctrl+L
快捷键阅读手册页面。 - KHelpCenter — KDE 帮助阅读程序,可以通过
khelpcenter man:
阅读手册。 - Konqueror — KDE 文件和网页浏览器,也可以通过
man:
显示手册。 - xman — 可以分类查看手册。
对于像 Ubuntu 这样的系统来说,应用程序的手册页常常以后缀
-doc
的独立包方式存在,例如 flex 包的配套手册页为 flex-doc 包。sudo apt install flex flex-doc
sudo apt install bison bison-doc
sudo apt install git git-doc
对于 POSIX 可移植性较为关注的人,可能会需要安装:
sudo apt install manpages-poxis*
然后就可以查阅 POSIX 调用,例如:
man 3p connect
等等。
阅读手册页 通过以下命令阅读man手册页:
$ man 手册名
man 手册页分为很多区块。完整的列表可以参考: man-pages(7)。
man 手册页通过名称和所属分类标识。有些不同分类的 man 手册页名字可能相同,比如 man(1) 和 man(7),这时需要额外指明分类以访问需要的手册。例如:
$ man 5 passwd
会显示有关文件
/etc/passwd
,而非命令 passwd
,的内容。快捷键(
less
)在手册页阅读界面中,可以使用快捷键来帮助阅读。
由于手册页的显示是使用操作系统 Shell 环境中的默认 PAGER 来完成的,所以快捷键遵循相应 PAGER 的功能映射。
大多数系统中现在默认采用
less
作为默认 PAGER,因此请参考 less 命令全知全会。布局
所有的手册页遵循一个常见的布局,其为通过简单的ASCII文本展示而优化,而这种情况下可能没有任何形式的高亮或字体控制。一般包括以下部分内容:
- NAME(名称)
该命令或函数的名称,接着是一行简介。
- SYNOPSIS(概要)
对于命令),正式的描述它如何运行,以及需要什么样的命令行参数。对于函数,介绍函数所需的参数,以及哪个头文件包含该函数的定义。
- DESCRIPTION(说明)
命令或函数功能的文本描述。
- EXAMPLES(示例)
常用的一些示例。
- SEE ALSO(参见)
相关命令或函数的列表。
你可以在
man-pages(7)
查阅到这些手册页内的区块的描述,如同我们前文中所描述的那样。一个较完整的列表节录如下:
NAME | |
---|---|
SYNOPSIS | |
CONFIGURATION | [Normally only in Section 4] |
DESCRIPTION | |
OPTIONS | [Normally only in Sections 1, 8] |
EXIT STATUS | [Normally only in Sections 1, 8] |
RETURN VALUE | [Normally only in Sections 2, 3] |
ERRORS | [Typically only in Sections 2, 3] |
ENVIRONMENT | |
FILES | |
VERSIONS | [Normally only in Sections 2, 3] |
ATTRIBUTES | [Normally only in Sections 2, 3] |
CONFORMING TO | |
NOTES | |
BUGS | |
EXAMPLES | |
AUTHORS | [Discouraged] |
REPORTING BUGS | [Not used in man-pages] |
COPYRIGHT | [Not used in man-pages] |
SEE ALSO |
在操作系统中,所有的手册页被按照其主题分类划分为多个区块,例如系统调用,Shell 命令,C 库函数等等。这些区块主要定位在
/usr/share/man/man1
到 /usr/share/man/man9
文件夹中。在 Arch Linux、Research Unix、BSD、OS X 和 Linux 中,手册通常被分为8个区块,安排如下:
区块 | 说明 |
---|---|
1 | 一般命令) |
2 | 系统调用 |
3 | 库函数,涵盖C标准函数库 |
4 | 特殊文件(通常是/dev中的设备)和驱动程序 |
5 | 文件格式和约定 |
6 | 游戏和屏保 |
7 | 杂项 |
8 | 系统管理命令)和守护进程 |
区块 | 说明 |
---|---|
1 | 一般命令) |
1M | 系统管理命令)和守护进程 |
2 | 系统调用 |
3 | C函数库函数 |
4 | 文件格式和约定 |
5 | 杂项 |
6 | 游戏和屏保 |
7 | 特殊文件(通常是/dev中的设备)和驱动程序 |
区块 | 描述 |
---|---|
0 | C函数库头文件 |
9 | 内核例程 |
n | Tcl/Tk关键字 |
x | X窗口系统 |
子区块 | 说明 |
---|---|
p | POSIX规范 |
x | X窗口系统文档 |
pm | Perl Module 函数 |
0Header files
0pHeader files (POSIX)
1Executable programs or shell commands
1pExecutable programs or shell commands (POSIX)
2System calls (functions provided by the kernel)
3Library calls (functions within program libraries)
3nNetwork Functions
3p,3pmPerl Modules
4Special files (usually found in /dev)
5File formats and conventions eg /etc/passwd
6Games
7Miscellaneous(includingmacropackages and conventions), e.g. man(7), groff(7)
8System administration commands (usually only for root)
9Kernel routines
lLocal documentation
nNew manpages
翻译过来粗略是:
- 0, 0p:已过时,相应的条目已经被合并到 section 3 之中了。
- l, n:基本上不存在于发行版中,但开发者可以用于开发周期中。
- 1:可执行程序或是 shell 指令。
- 2:系统调用(system calls,Linux 核心所提供的函數)。
- 3:一般库函數,C 库函数。
- 4:特殊文件(通常位于
/dev
之中)。 - 5:文件格式于协定,如
/etc/passwd
- 6:游戏。
- 7:杂项(宏处理等,如
man(7)
、groff(7)
)。 - 8:系统管理员指令(通常是管理者
root
专用指令)。 - 9:Kernel routines(非标准)。
man-pages(7)
查阅到这些区块的描述,如同我们前文中所描述的那样。在手册页系统中的会用小括号来注明手册所属的区块,例如
ls(1)
表示 Shell 命令 ls
隶属于区块 1。有时候一个主题名称可能会在不同的区块中有不同的说明文件,若是查询一个主题时未能在指定区块中找到,那么 man 会依照
1 n l 8 3 2 3posix 3pm 3perl 5 4 9 6 7
的顺序依次检索相应的其它区块,然后显示第一个搜索到的章节内容。例如
passwd
这个主题 passwd(1)
与 passwd(5)
两个章节,如果不指定章节的话:man passwd
会显示
passwd(1)
,而若要查询 passwd(5)
的话,就应该明确指定区块编号:man 5 passwd
如果你对这种语法感到困惑的话,可以采用如下的格式:
man passwd.5
两者是等效的。
列出所有章节
由于具体主题的复杂性,所以有的条目未必在你以为的分区中,例如 recv C 函数的参考并不是在分区 3 中,而是在分区 2 中,因为它是 Linux 内核调用之一。这种情况在系统调用和 C 库函数重名时常常可见。
有时候我们对某主题很感兴趣,但却并不知道该主题有哪些章节可以被查询,这时候就可以用
-aw
参数进行查询:man -aw printf
典型的结果可能是这样:
/usr/share/man/man1/printf.1.gz
/usr/share/man/man1/printf.1posix.gz
/usr/share/man/man3/printf.3.gz
/usr/share/man/man3/printf.3posix.gz
但你或许更喜欢 whatis 返回的结果:
$ whatis printf
printf (1)- format and print data
printf (3)- formatted output conversion
printf (1posix)- write formatted output
printf (3posix)- print formatted output
它更直观。
whatis 等价于
man -f
:$ man -f printf
printf (1)- format and print data
printf (3)- formatted output conversion
printf (1posix)- write formatted output
printf (3posix)- print formatted output
一次查阅所有章节
如果要一次性查阅某个主题的所有章节,可以用
-a
参数,这会令 man
依次显示所有章节:man -a printf
当你看完一个章节并按
q
退出之后,man
会显示:--Man-- next: printf(3) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
j简单地回车(按下 Enter 键)就可以继续阅读下一个章节。你也可以用 Ctrl-C 终止 man 返回到 Shell 提示符状态。
搜索手册页
如果用户压根儿不知道要查阅的手册的名称,该怎么办呢?没事,通过
-k
或者 --apropos
参数就可以按给定关键词搜索相关手册。例如,要查阅有关密码的手册(“password”):$ man -k password
chage (1)- change user password expiry information
chgpasswd (8)- update group passwords in batch mode
chpasswd (8)- update passwords in batch mode
...
pam_unix (8)- Module for traditional password authentication
passwd (1)- change user password
passwd (1ssl)- compute password hashes
passwd (5)- the password file
passwd2des (3)- RFS password encryption
...
pwd.h (7posix)- password structure
...
shadow (5)- shadowed password file
shadowconfig (8)- toggle shadow passwords on and off
smbpasswd (5)- The Samba encrypted password file
smbpasswd (8)- change a user's SMB password
...
xdecrypt (3)- RFS password encryption
xencrypt (3)- RFS password encryption
man -k
会筛选主题名称以及简短描述文字来尝试匹配给定的关键字。现在你可以开始搜索了。 例如,要查阅有关密码的手册(“password”),可以使用下面的命令:
$ man -k password
$ man --apropos password
$ apropos password
它们是同义词。
关键字可以使用正则表达式。
例如全文检索某个关键字
$ man -k sprintf asprintf (3)- print to allocated string sprintf (3)- formatted output conversion Text::sprintfn (3pm) - Drop-in replacement for sprintf(), with named parameter support vasprintf (3)- print to allocated string vsprintf (3)- formatted output conversion
注意得到上面的结果需要首先安装:
sudo apt install libtext-sprintfn-perl
以保证 Text::sprintfn (3pm) 条目已经存在。
/usr/share/man/man3/Text::sprintfn.3pm.gz
如果你想全文搜索的话,你可以用
-K
选项:$ man -K sprintf
它会打开第一个手册页供你阅读,你可以
q
退出阅读界面,而后会有一个提示:--Man-- next: gcc-7(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
此时你可以回车(Enter)阅读下一个匹配的手册页,也可以 Ctrl-C 退出 man -K 状态。
其它功能
在浏览器中显示手册页
man -Hfirefox printf
此功能可能需要
groff
命令能够在 PATH 路径中可被搜索到。所以你也许需要显式地安装 groff
:sudo apt-get install groff
指定分页程序(PAGER) 我们提到过显示主题内容使用的是通过环境变量 PAGER 指定的分页程序,默认时为 less。但你可以显式地指定其它分页程序作为显示工具,这是通过命令行参数
-P
来指定的:man -P more printf
转换为纯文本、网页或 PDF 纯文本
man printf | col -b > printf.txt
网页 首先,安装软件包 man2html。
然后使用它转换 man 手册页:
$ man free | man2html -compress -cgiurl man$section/$title.$section$subsection.html > ~/man/free.html
此外,
man2html
还可以把 man 页转换为便于打印的文本文件:$ man free | man2html -bare > ~/free.txt
另一种方式是直接通过 groff 来做:
zcat `man -w printf` | groff -mandoc -T html > printf.html
PDF 将手册页转换为 PDF:
man -t printf | ps2pdf - printf.pdf
man pages 是可以打印的,遵循 troff 格式,本来就是一种打印设置语言,安装 ghostscript 后,可以用下面命令将 man 页面转换为 PDF
man -t | ps2pdf -
.注意这里仅能使用 Times 字体,没有超链接,有些手册是转为终端设计,PS 或 PDF 格式看起来不太正常。
指定文字语言 你可以安装 manpages-zh 包来提供中文手册页支持。
在终端中,设置 LANG 环境变量为
UTF-8.zh_CN
,则 man 会以中文方式显示主题章节内容。不过如果没有中文版的话,还是会 fallback 到英文版。如果你不想改变环境变量,也可以通过命令行参数
-L
来达到目的,例如man -L en 5 passwd
man -L zh_CN 5 passwd
其它信息 手册页存储在哪里?
典型的位置在
/usr/share/man
和 /usr/local/share/man
中。此外,常常会有
/usr/man
和 /usr/local/man
的符号链接。manpath 命令是获知确切的存储位置的正确方法:
$ manpath
/usr/local/man:/usr/local/share/man:/usr/share/man
manpath 命令或者 man 命令都是通过
/etc/manpath.config
或者 /etc/man_db.conf
配置文件来取得正确的存储位置集合的。但对于多数人来说我们不建议你去探究这些配置文件,它们遵循一定的格式约定,但分析和抽取结果往往对于 Shell 脚本来说过于繁杂了,远不如分析 manpath 返回的结果来得简单易用。要获知
/etc/manpath.config
的更多信息,可以查看手册页 man manpath
。有的时候,
$MANPATH$
环境变量可能包含了正确的值。但绝大多数情况下可能它都是空值。另一种方法是通过 whereis 命令来间接获知:
$ whereis man
man: /usr/bin/man /usr/local/man /usr/share/man /usr/share/man/man1/man.1.gz /usr/share/man/man7/man.7.gz
/usr/share/man-db/chconfig
是一个 perl 执行脚本,会重新生成 /etc/manpath.config
,这是系统级的内部行为。使用在线手册页
许多网站提供在线man手册页,详细列表参见:Wikipedia:Man_page#Repositories_of_manual_pages。
- Man7.org. Upstream for Arch Linux's man-pages.
- Debian GNU/Linux man pages
- DragonFlyBSD manual pages
- FreeBSD Hypertext Man Pages
- Linux and Solaris 10 Man Pages
- Linux/FreeBSD Man Pages[失效链接 2020-08-04 ?] with user comments
- Linux man pages at die.net
- The Linux man-pages project at kernel.org
- NetBSD manual pages[失效链接 2021-05-17 ?]
- Mac OS X Manual Pages[失效链接 2021-11-13 ?]
- On-line UNIX manual pages
- OpenBSD manual pages
- Plan 9 Manual — Volume 1
- Inferno Manual — Volume 1
- Storage Foundation Man Pages[失效链接 2020-08-04 ?]
- The Missing Man Project [dead link as of 9 July 2010]
- Gobuntu Manual Pages[失效链接 2020-08-04 ?] [dead link as of 9 July 2010]
- The UNIX and Linux Forums Man Page Repository
- Ubuntu Manpage Repository
man man
man man-pages
- man page (简体中文) - ArchWiki)
- man page - Wikipedia
【Linux 命令 man 全知全会】