查看命令文档的命令
经过前面十几章的学习,我们已经学过许多的命令。这其中有些命令我们并没有详尽的介绍所有的参数和用法。并且我们也反复提到,阅读命令的文档是一个很有用的学习命令参数细节的手段。但是,我们还有介绍过如何查阅一个命令的文档。当然,你通常可以通过去搜索引擎中查询相应命令的文档,但是这个方式有的时候不太方便,我们还需要从搜索结果中筛选那个结果更加全面。除此之外,一些同学经过自己的探索可能已经发现了,对于大部分命令我们也可以使用-h
/--help
参数来打印帮助文档,但是这个文档通常十分简略并且也有少数的命令没有这个选项。所以这里我们再介绍两种很好用的了解命令用法或者查阅命令文档的方式。
查看命令提供的官方文档——man
大部分的linux命令都会提供一个讲解全面的官方文档,它会在你安装命令的时候自动被下载到你的系统中。这个命令的基础用法也十分简单,就是直接使用一个位置参数来表示你要查看的命令的名称。你可以选择我们之前提到过的命令直接尝试一下。例如:
man ls
ls
命令的说明文档了。(我们也可以使用man man
来查看man
自己的文档。顺带一提,man
是mannual的缩写。)。你会进入一个特殊的界面中,在这个界面中,你可以使用键盘的上下键来移动浏览。同时,如果你知道如何使用vim(一个在终端中使用的编辑器,你不知道也没关系),你会发现在这个文档界面中,有很多操作与vim中非常类似。在这里我也简单介绍几个最常用的操作。
1. 可以使用键盘上下方向键或者鼠标的光标来进行上下移动。
2. 使用大写G
(也就是shift+G)可以跳到文档最后,按两下小写g
可以跳到文档最开头。
3. 按/
可以进入搜索模式,输入你要搜索的文字,支持使用正则表达式,然后按下回车键就可以搜索,匹配的内容被会高亮显示。同时,你可以按小写n
跳转到最近的下一个匹配项,按大写N
跳转到最近的上一个匹配项。
4. 可以按q
退出。
文档的分区(section)
在linux的man
命令可以查看的文档中,不止有我们系统上的命令的文档,还有很多其他种类的文档。在man
命令的文档中,它们被称作不同的section。这可能稍微有点歧义,因为同一个文档中的不同部分也叫section。这里我暂且将不同种类的文档成为文档的分区,将同一个文档的不同部分称为文档的节。通过查阅man
的文档,我们可以了解到,总共有九种文档:
1. 可执行程序或者shell命令,这一类也是我们到目前为止会最常用到的。
2. 系统调用,例如:man close
你可以查看到close
系统调用的文档。(如果你忘记了什么是系统调用,请回去查看一下第二章的介绍)
3. 库函数,这一部分是你的安装到系统中的库中的函数的介绍。例如:man scanf
,你可以看到scanf
函数的介绍。
4. 特殊文件,系统为我们提供了一些有特殊用途的文件,它们很有用,在中级篇我们会进行详细的介绍。例如:man null
,你可以看到/dev/null
这文件的介绍。
5. 文件格式和转换,这里主要记载了一些系统或者软件的配置文件的格式的文档。例如,man netplan
可以查看用于网络配置工具netplan
的配置文件格式。(你的系统可能不自带netplan
,这会导致你查看不到man netplan
的结果)
6. 游戏。系统中的游戏的说明文档。
7. 杂项。这里主要包含一些命名标准,规范等。例如:man inode
可以用于查看文件系统中的inode
的说明,man mna-pages
可以用于查看编写文档的规范。
8. 系统管理员指令。这里是系统管理员可以使用的指令的说明文档,这里会包含的命令我还没有介绍过,但是这也是系统的重要部分,后面我们会提到。例如:man sudo
,可以查看sudo
命令的文档,这个命令我们会在下一章提到。
9. 内核调用(routine),这个部分并不是标准要求,并不适用于所有系统,所以这里就不做额外介绍了。
指定文档的分区
那么,将文档分成这么多部分有什么好处呢?最重要的一个好处就是,不同分类中的文档可以拥有相同的名字,但仍然不会混淆。例如,time
既可以是一个系统命令,同时也是系统调用的名称,还是系统中关于时间的规范的文档名称。默认情况下,man
命令在上面的分区编号中从小到大开始索引文档,并显示第一个搜索到的文档。
当然我们也可以指定我们要查询的文档的分区,例如你想查阅C标准库中的printf
的用法,就可以使用下面这个命令:
man 3 printf
printf
的文档。
另外,在每个分区中都有一个叫intro
的文档作为这个分区的详细介绍。也就是说,你可以通过man <n> intro
来查看第n个分区的详细文档。
文档的位置
大家可能会比较好奇,这些文档都是放在我们的文件系统中的哪个位置的呢?实际上,我们可以通过whereis
命令来查看一个命令的可执行文件以及文档的位置,例如:
whereis ls
# ls: /usr/bin/ls /usr/local/bin/ls /usr/share/man/man1/ls.1.gz
ls
的可执行文件的位置在/usr/bin/ls
, /usr/local/bin/ls
各有一个(有多种原因会导致你的系统中某些常用命令在不同位置有多个),并且我们还能看到ls
的文档位置在/usr/share/man/man1/ls.1.gz
。
我们很容易能猜到系统中的文档应该主要都在/usr/share/man
路径下,并且/usr/share/man/man<x>
就是第x个分区的文档。这一点,我们可以通过ls /usr/share/man
来验证,确实是这样。
另外,你通过查看其他分区的文档文件夹,还可以发现一个规律,也就是文档的名称一般都是<name>.<n>.gz
,其中name
部分就是用于索引这个文档的名称,n
则是分区编号,gz
我们很容易能看出,是之前介绍过的gzip
的压缩格式文件的后缀。这一点,我们可以通过file /usr/share/man/man1/ls.1.gz
来验证。
那么,我们就可以通过gzip
来尝试解压缩一下一个文档的实际内容。你可以通过下面这个命令来解压缩cat
的文档文件并把它直接打印到屏幕上,
gzip -dc /usr/share/man/man1/cat.1.gz
根据上面我们的探索,我们已经可以窥探到man
命令的运行方式了。它会根据我们提供的名称去系统中的文档目录中检索,如果指定了分区就只搜索对应分区,按编号从小到大搜索分区。如果搜索到了,那么就解压缩对应的文档文件并解析它的标记将它呈现给我们。这里补充一点,文档文件不必须是gzip
的压缩文件,可以不经过压缩。
整活文档
根据我们上面对文档的了解,我们也可以尝试创建一个我们的自己文档了。只需要下面一个命令就可以创建一个最简单的文档:
echo "Mamba out" > /usr/share/man/man1/whatcanisay.1
man whatcanisay
更加简单直接的命令说明——tldr
虽然我们已经有了一个比较好用并且非常详细的文档工具,但是这个工具仍然有一个问题,就是官方提供的文档实在是太长了,通常都会对于所有的细节都详细说明。因此,一批苦于阅读文档的人们就开发了tldr
这个工具。tldr是Too Long Don't Read的缩写,翻译过来就是“省流版”。
tldr
的用法和man
的基础用法一样,根据你给出的位置参数的名称检索相关的文档并且显示。但是它与man
还是有很多不同。首先,tldr
通常只包含对命令功能的一句话说明以及若干实用的例子,而不会详细介绍命令的全部用法和细节。因此,tldr
的文档通常很短,也就不需要进入像是man
那样的特殊界面来显示了,它会直接打印到终端上。另外,tldr
没有分区,并且大部分文档也都是命令的文档,通常不会包含库函数等的文档。
tldr
的模式也与man
有明显不同,它的文档并不是来自官方,也不是跟随软件一起安装到你的系统上的。tldr
中的文档都是由开源社区提供的。所以,即使你的系统中没有的软件,tldr
中也可以检索到;一些你的系统中的冷门软件,tldr
中可能没有。tldr
中的所有文档都在它的github仓库中,在你安装了tldr
之后你也不能立即使用,需要首先运行tldr --update
来更新文档(在你没有任何文档的时候,这个操作就相当于下载了文档)。对于Ubuntu系统可以直接使用sudo apt install tldr
来安装tldr
。
最后,我再来介绍tldr
的一个不太直接的用法。有的时候,我们使用的一些稍微有点复杂的命令可能会有很多子命令。也就是命令名称后面紧跟第二个单词,这个单词就像是第二级命令,支持各种参数和用法,同时这个命令还有很多不同的第二级命令,它们的参数用法都各不相同。例如,我们之前应该已经使用过几次的apt install xxx
。apt
本身就是一个命令,它是一个包管理器,但是它后面紧跟一个install
表示使用包管理器中的安装功能,这样apt install
本身看上去就像是一个独立的命令一样,不过它的功能只是apt
的功能的一个子集。这样的例子在一些功能复杂的命令中很常见。那么这种情况下,直接使用tldr apt
可能无法得到你想要的结果,因为它的文档比较简洁,无法包含一个复杂的命令的所有子命令的用法。这种情况下,我们可以使用tldr apt-install
来搜索,也就是将命令和它的子命令两个(也可能更多)单词之间用-
连接之后进行搜索。这样你就能得到关于这个子命令的更多详细信息了。
小结
这一章主要介绍了Linux的shell当中,查阅文档的方式。包括一个全面详尽的官方文档man
和一个更加精简由社区贡献的文档tldr
。实际上,功能类似于tldr
的项目还有很多,感兴趣的同学可以自己探索。另外,由于tldr
是由社区贡献的,所以如果你在使用过程中发现文档中的错误缺漏等,也可以向作者报告,或者自己帮忙修改和添加。