背景
请自问自答:
- 你觉得linux中最重要的命令是哪个?
- 你是否已经掌握了它?
- 你认为它最重要的理由是什么?
正所谓“自助者天助之”,在linux系统中,最重要的命令应当是能够让你“自助”的命令。
这个命令就是man
——用来查看linux的文档系统。它之所以是最重要的命令,是因为通过它你能学习到其它任何命令,这无疑是为你打开了一扇信息大门。
简介
Unix系统中有两个重要的文档系统:
- Unix联机手册:Unix系统默认提供的文档系统;
- Info系统:GNU项目的官方文档系统;
自学的传统
在unix的传统中,自学是一个极其重要的传统,在之前的文章Unix文化--RTFM提到过。
生而知之者上也;学而知之者次也;困而学之又其次也;困而不学,民斯为下矣。
别指望什么“生而知之”,能做到“学而知之”就相当不错了。RTFM一般发生在遇到困难时,更像是“困而学之”,但它强调的是一种主观能动性,因此是“学而知之”的层次。
unix手册
Unix手册也通常称为“联机手册”、“手册”,相当于我们平常所说的“官方帮助文档”。
如何使用
unix手册的查看方式非常简单,使用man
命令,意思是manual
(手册、指南),后接你要查看的命令的名称,即:
man X
(注意不是X man)。
比如,想要查看ls
的用法,使用:
man ls
也可以后接多个命令,这样将会逐个显示后接命令的帮助手册内容,如:
man pwd ls cd
说明书页
一个命令的帮助文档是一个单独的条目,如命令man ls
的显示内容,称为“一页”,也叫做“说明书页”。
如果说明书页的内容大于一屏,将分屏显示(事实上帮助文档不超过一屏的命令并不多)。
分屏的命令有less
、more
、pg
,其中less
最好用,使用最广泛,也是man命令显示说明书页的默认分屏工具。
若希望用指定的分屏工具显示帮助信息,使用管道线连接命令:
man ls | less
man cp | more
man pwd | pg
在查看帮助文档内容时,还可以使用一些命令来辅助阅读,比如对于默认的分屏工具less
来说,按<space>
(空格)键会显示下一屏内容,按q
键会退出,等等。
然而,无论使用什么分屏工具,最重要的命令是h
,它显示帮助信息。你看,再一次突出帮助命令的重要性。
当按h
键后,屏幕上将显示该分页工具的所有命令的摘要信息,想结束阅读时,按q
退出,再回到说明书页中:
-
less
的h
命令摘要
SUMMARY OF LESS COMMANDS
Commands marked with * may be preceded by a number, N.
Notes in parentheses indicate the behavior if N is given.
A key preceded by a caret indicates the Ctrl key; thus ^K is ctrl-K.
h H Display this help.
q :q Q :Q ZZ Exit.
MOVING
e ^E j ^N CR * Forward one line (or N lines).
y ^Y k ^K ^P * Backward one line (or N lines).
...省略...
SEARCHING
/pattern * Search forward for (N-th) matching line.
?pattern * Search backward for (N-th) matching line.
...省略...
JUMPING
g < ESC-< * Go to first line in file (or line N).
G > ESC-> * Go to last line in file (or line N).
...省略...
CHANGING FILES
:e [file] Examine a new file.
...省略...
MISCELLANEOUS COMMANDS
-<flag> Toggle a command line option [see OPTIONS below].
...省略...
OPTIONS
Most options may be changed either on the command line,
or from within less by using the - or -- command.
Options may be given in one of two forms: either a single
character preceded by a -, or a name preceded by --.
...省略...
LINE EDITING
These keys can be used to edit text being entered
on the "command line" at the bottom of the screen.
RightArrow ESC-l Move cursor right one character.
...省略...
-
more
的h
命令摘要
多数命令可在前面加整数参数 k。方括号中为参数的默认值
星号(*)表示参数将成为新的默认值。
<空格键> 显示下 k 行文本[当前屏幕尺寸]
z 显示下 k 行文本[当前屏幕尺寸]*
<回车键> 显示下 k 行文本[1]*
d 或 ctrl-D 滚动 k 行[当前滚动尺寸,初始值为 11]*
q 或 Q 或 <interrupt> 退出 more
s 跳过下面 k 行文本[1]
f 跳过下面 k 屏文本[1]
b 或 ctrl-B 跳过上面 k 屏文本 [1]
' 转到上次搜索开始处
= 显示当前行号
/<正则表达式> 搜索正则表达式第 k 次出现处[1]
n 搜索前一正则表达式第 k 次出现处[1]
!<cmd> 或 :!<cmd> 在子 shell 中执行 <cmd> 命令
v 在当前行启动 /usr/bin/vi
ctrl-L 重绘屏幕
:n 转到后面第 k 个文件[1]
:p 转到前面第 k 个文件 [1]
:f 显示当前文件名和行号
. 重复前一命令
-
pg
的h
命令摘要
pg 1.44 2/8/02. Copyright (c) 2000-2001 Gunnar Ritter. All rights reserved.
h this screen
q or Q quit program
<newline> next page
f skip a page forward
d or ^D next halfpage
l next line
$ last page
/regex/ search forward for regex
?regex? or ^regex^ search backward for regex
. or ^L redraw screen
w or z set page size and go to next page
s filename save current file to filename
!command shell escape
p go to previous file
n go to next file
Many commands accept preceding numbers, for example:
+1<newline> (next page); -1<newline> (previous page); 1<newline> (first page).
See pg(1) for more information.
由以上三个分页命令的命令摘要也可以看出,less最好,难怪作为了man命令的默认分页工具呢!
说明书页的组织方式
我们看的各种书籍可以翻页,但Unix帮助手册不能翻页,因为并没有定义页码。它更像是一种具有层次结构的电子书。
通常情况下,unix手册分成了8节(不同的系统之间略有差异)。
- 命令
- 系统调用
- 库函数
- 特殊文件
- 文件格式
- 游戏
- 杂项信息
- 系统管理
从以上8种的大体分类也可以知道,不同节的知识侧重点不同,适用的人群也就不同,如:
节1的命令是基础中的基础,对所有unix使用者都有用;
节2、节3、节7则更适合程序员;
节7、节8则更适用于系统管理员;
...... 等等。
如下是各节的详细说明:
命令
Unix手册中最重要的部分就是第1节——命令。这部分包含了大量的unix命令的说明书页。系统调用
本节是系统调用的说明书页,在程序中使用系统调用,以请求内核执行特定的动作。库函数
库函数,也称为子例程,是标准化的工具,不会直接涉及内核,在程序中执行特定的任务。特殊文件
该部分主要是指那些表示物理设备的文件,还包括设备驱动程序的信息。文件格式
本节介绍系统中的重要文件格式,包括配置文件。游戏
该节提供系统中所安装游戏的说明书页。在工作中碰到的linux机器,手册中的第6节很可能是空的,原因你懂的。杂项信息
既然叫杂项信息,那就是各种混杂信息了。系统管理
主要包括系统管理员用来执行工作所使用的所有特殊命令的说明书页,也就是那些只能由超级管理员使用的命令。
指定要查看的节号
前面介绍了要想查看某命令的unix手册,使用man命令后接该命令的名称,如:
man kill
而上面我们知道man手册分为多节,那么上述这个命令到底查看的是哪节呢?答案是第一节。
通过上述命令的输出(第一行中行首和行末括号中的数字)也可以判断:
KILL(1) User Commands KILL(1)
一般在命令帮助手册的最后,有“SEE ALSO”的两行,如:
SEE ALSO
kill(2), killall(1), nice(1), pkill(1), renice(1), signal(7), skill(1)
这说明与kill命令相关的其它几个命令的引用。可以看到kill(2)
,即第二节中也有个kill的条目,那么应该如何查看该条目呢?
依然使用man命令后接要查看的命令的名字,只不过在它们中间指定节号:
man 2 kill
输出的首行如下:
KILL(2) Linux Programmer's Manual KILL(2)
因而,man kill
也等同于man 1 kill
。
如果希望同时查看kill帮助手册的第一节和第二节,可以使用man 1 kill 2 kill
。
说明书页的格式
你用man来查看多个命令的帮助手册,你会发现这些说明书页都遵循大体相同的格式,如常见的有:
- Name
命令的名称和用途,一般情况下是一个单行的摘要,因此意思比较模糊。 - Synopsis
命令语法,如果想知道一个命令如何使用,看这部分就足够了。 - Description
完整描述(可能很长),包含了很多使用细节。 - Environment
命令使用的环境变量。 - Author
开发该命令的程序员的名字。 - Files
对该命令重要的文件列表。 - See also
查看相关信息的位置,一般显示了相关命令以及其在帮助文档中的节数。 - Diagnostics
可能的警告和错误。 - Bugs
错误、缺点、警告等。
快速查找命令
在文章情景linux--不借助网络如何找到你需要的命令中介绍了一种快速查找命令的方式。
如果你想查询命令的作用,可以使用man -f
,后接命令名称,也可以接多个命令,如:
man -f basename dirname
它将显示后接命令的一句话作用描述:
basename (1) - strip directory and suffix from filenames
basename (3) - parse pathname components
dirname (1) - strip last component from file name
dirname (3) - parse pathname components
whatis
命令等价于man -f
whatis basename dirname
basename (1) - strip directory and suffix from filenames
basename (3) - parse pathname components
dirname (1) - strip last component from file name
dirname (3) - parse pathname components
文档结构
unix联机手册是一个文件集,每个文件是一个具体命令的相关文档资料。那么,unix联机手册对应的文件在哪里能够找到呢?
前面提到说明书页中有一节“FILES”是指该命令的相关文件,查看man命令的说明书页中的“FILES”:
FILES
/etc/manpath.config
man-db configuration file.
/usr/share/man
A global manual page hierarchy.
/usr/share/man/index.(bt|db|dir|pag)
A traditional global index database cache.
/var/cache/man/index.(bt|db|dir|pag)
An FHS compliant global index database cache.
可见,man的帮助文档页存于目录/usr/share/man
中。
至于这些文件是怎样保存的,文件的格式,文件的内容是怎样的,请自行探索,你会有所收获的,也可以辅助理解unix联机手册。
Info系统
Info系统独立于unix手册,是一个联机帮助系统,用来记录GNU实用工具的用法。GNU实用工具在unix世界很普遍,所以掌握如何使用Info系统也大有裨益。
查看info系统中的文件,需要使用info命令,后接要查看的命令,即,info X
。
info time
File: time.info, Node: Top, Next: Resource Measurement, Up: (dir)
The GNU `time' Command
**********************
This file documents the the GNU `time' command for running programs and
summarizing the system resources they use. This is edition 1.7, for
version 1.7.
* Menu:
* Resource Measurement:: Measuring program resource use.
* Concept index:: Index of concepts.
使用man time
对比一下:
man time
TIME(1) General Commands Manual TIME(1)
NAME
time - run programs and summarize system resource usage
SYNOPSIS
time [ -apqvV ] [ -f FORMAT ] [ -o FILE ]
[ --append ] [ --verbose ] [ --quiet ] [ --portability ]
[ --format=FORMAT ] [ --output=FILE ] [ --version ]
[ --help ] COMMAND [ ARGS ]
...省略...
unix帮助手册和info系统的分工不同,决定了所有的unix和linux命令都有说明书页,但却不一定有info文件。因此,如果尝试显示一个命令的info文件,而系统上没有时,会默认显示其说明书页。
一点儿经验,请笑纳
最重要的常常被忽略
man命令常常被大多数人忽略。现如今,获取信息的成本非常之低,当你不清楚一个命令的用法时,上网使用搜索引擎就可以轻松解决了。
但,仅仅这样做并不够好。
- 使用搜索引擎和使用
man
命令查阅帮助文档并不冲突; - 轻松不代表高效,你仔细想过没有?使用搜索引擎和使用man查询帮助文档相比,后者效率更高,熟练掌握后成本更低!
- 这不是一种非此即彼的选择,我觉得,两种方式配合使用会更好。
专项查询窗口
可以专门开个终端窗口,只为随时能查询命令的用法。
一般的终端软件,如xshell
、putty CM
等都支持将两个终端窗口以水平或竖直分布的方式同时显示在屏幕上,一个窗口作为你工作的窗口,另一个则用于查询命令手册,工作效率会更高。
!的妙用
另外,在查询命令的帮助文档时,如果需要查看另一个命令的帮助信息,或者想知道某个命令的执行结果,这时你大可不必退出当前的说明书页,也没必要再重新打开一个终端窗口,你可以直接在当前状态下得到你想要的结果。
比如,在查看basename的帮助文档时,想要看下dirname的某个参数,输入“!man dirname”即可,当前页面会转到dirname的说明书页,当你从dirname的说明书页退出后,屏幕显示“!done (press RETURN)”,此时按回车键会再回到basename的帮助文档页。
观其大略
linux命令的参数一般有多个,最常用的几个参数能应付得了日常需要,不常用的参数往往满足某个特殊的需求。因而,无所事事的时候,不妨粗略阅读一个命令的说明书页,目前是大致了解一个命令的作用,大致有哪些参数,结合实际思考其可以使用的场景。这样,在寻找命令或参数上能节省很多的时间。而且,这种“遍历式的阅读文档”,往往能发现更加给力的命令和参数。
总结
unix文档系统是一部字典,在这里,我只能给出查阅字典的方法和方法论,无论是unix文档系统本身,还是文档系统中的命令们,更多内容还有待我们去探索。
掌握了查阅unix文档系统的方法,仅仅是一个开始,但正因为有这样的开始,你的linux成长之路会比在这之前要更加的畅通和高效。
参考资料
http://www.gnu.org/software/texinfo/
书籍《Unix & Linux 大学教程》第9章
情景linux--不借助网络如何找到你需要的命令
Unix文化--RTFM
你为什么必须(从现在开始就)掌握linux