摘要
对 man 的各种用法做一次整顿,顺便也能够当作参考手册。
<!--MORE-->

引子

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:<name>Ctrl+L 快捷键浏览手册页面。
  • KHelpCenter — KDE 帮忙阅读程序,能够通过 khelpcenter man:<name> 浏览手册。
  • Konqueror — KDE 文件和网页浏览器,也能够通过 man:<name> 显示手册。
  • xman — 能够分类查看手册。

对于 Linux 发行版来说,man 是标准配置,任何一个最小零碎均蕴含了 man 命令(即,man-db 包总是被预装的),但手册页的文档内容局部则不肯定了,依据理论状况进行选装。

对于像 Ubuntu 这样的零碎来说,应用程序的手册页经常当前缀 -doc 的独立包形式存在,例如 flex 包的配套手册页为 flex-doc 包。

sudo apt install flex flex-docsudo apt install bison bison-docsudo 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(参见)

    相干命令或函数的列表。

也可能存在其余局部内容,但这些局部没有失去跨手册页的标准化。常见的例子包含:OPTIONS(选项),EXIT STATUS(退出状态),ENVIRONMENT(环境),BUGS(程序破绽),FILES(文件),AUTHOR(作者),REPORTING BUGS(已知破绽),HISTORY(历史)和COPYRIGHT(著作权)。

你能够在 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系统管理命令)和守护过程

Unix System V 采纳了相似的编号计划,但程序不同:

区块阐明
1个别命令)
1M系统管理命令)和守护过程
2零碎调用
3C函数库函数
4文件格式和约定
5杂项
6游戏和屏保
7非凡文件(通常是/dev中的设施)和驱动程序

在某些零碎中还有下述的区块可用:

区块形容
0C函数库头文件
9内核例程
nTcl/Tk关键字
xX窗口零碎

一些区块利用后缀进一步细分了。例如在一些零碎中,区块3C是C函数库调用,3M是数学(Math)函数库,等等。这样做的后果是区块8(系统管理命令)有时也被挪动到区块1M(作为命令)区块的子区块)。一些子区块后缀有跨区块的个别含意:

子区块阐明
pPOSIX标准
xX窗口零碎文档
pmPerl Module 函数

综述

综上所述,手册页的次要的类别和对应的编号有:

0     Header files0p    Header files (POSIX)1     Executable programs or shell commands1p    Executable programs or shell commands (POSIX)2     System calls (functions provided by the kernel)3     Library calls (functions within program libraries)3n    Network Functions3p,3pm    Perl Modules4     Special files (usually found in /dev)5     File formats and conventions eg /etc/passwd6     Games7     Miscellaneous  (including  macro  packages and conventions), e.g. man(7), groff(7)8     System administration commands (usually only for root)9     Kernel routinesl     Local documentationn     New 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(非标准)。

留神前文曾经提及,绝大多数零碎中,只有区块 1 到 8 这几个类别。你能够在 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 printfprintf (1)           - format and print dataprintf (3)           - formatted output conversionprintf (1posix)      - write formatted outputprintf (3posix)      - print formatted output

它更直观。

whatis 等价于 man -f

$ man -f printfprintf (1)           - format and print dataprintf (3)           - formatted output conversionprintf (1posix)      - write formatted outputprintf (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 passwordchage (1)            - change user password expiry informationchgpasswd (8)        - update group passwords in batch modechpasswd (8)         - update passwords in batch mode...pam_unix (8)         - Module for traditional password authenticationpasswd (1)           - change user passwordpasswd (1ssl)        - compute password hashespasswd (5)           - the password filepasswd2des (3)       - RFS password encryption...pwd.h (7posix)       - password structure...shadow (5)           - shadowed password fileshadowconfig (8)     - toggle shadow passwords on and offsmbpasswd (5)        - The Samba encrypted password filesmbpasswd (8)        - change a user's SMB password...xdecrypt (3)         - RFS password encryptionxencrypt (3)         - RFS password encryption

man -k 会筛选主题名称以及简短形容文字来尝试匹配给定的关键字。

当初你能够开始搜寻了。 例如,要查阅无关明码的手册(“password”),能够应用上面的命令:

$ man -k password$ man --apropos password$ apropos password

它们是同义词。

关键字能够应用正则表达式。

例如

$ man -k sprintfasprintf (3)         - print to allocated stringsprintf (3)          - formatted output conversionText::sprintfn (3pm) - Drop-in replacement for sprintf(), with named parameter supportvasprintf (3)        - print to allocated stringvsprintf (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 <manpage> | ps2pdf - <pdf>.

留神这里仅能应用 Times 字体,没有超链接,有些手册是转为终端设计,PS 或 PDF 格局看起来不太失常。

指定文字语言

你能够装置 manpages-zh 包来提供中文手册页反对。

在终端中,设置 LANG 环境变量为 UTF-8.zh_CN,则 man 会以中文形式显示主题章节内容。不过如果没有中文版的话,还是会 fallback 到英文版。

如果你不想扭转环境变量,也能够通过命令行参数 -L 来达到目标,例如

man -L en 5 passwdman -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 manman: /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

后记

本文中有的内容齐全复制于参考链接中。