|
Harley Hahn 的
|
|
各章...
命令
教师 |
第 9 章...
文档:
在 Unix 的世界里,有许多 不同的文档系统,每个都有 自己的特点。有些被广泛使用; 有些则服务于某个特定的细分领域。一般来说, 所有这类系统都有两个共同目标: 让程序员易于为自己的工作 编写文档,也让用户易于学习 如何使用程序员创造的工具。 在本章中,我将教你如何使用 两个最重要的 Unix 文档系统:在线 Unix 手册, 这是每个 Unix 系统都自带的功能; 以及 Info,GNU 项目的官方文档系统。 这两种工具都是为配合 Unix CLI(命令行界面) 使用而设计的。 原因在于,图形程序是自文档化的, 也就是说,它们几乎总是有自己的 内置帮助功能。因此,当你想向一个 基于图形用户界面的程序寻求帮助时,不要使用 在线手册或 Info。你应该到程序内部去找, 通常是打开一个 Help(帮助)菜单。
正如我们在第 2 章讨论过的,Unix 诞生于 20 世纪 70 年代初的新泽西, 在贝尔实验室(当时是 AT&T 的一部分)开发而成。 Unix 创建后不久,就受到了程序员和研究人员的 欢迎,最初是在贝尔实验室内部, 后来又进入少数几所研究型大学的 计算机科学系。 随着 Unix 日益流行,需要学习如何使用 这个系统的人越来越多。 然而,贝尔实验室的程序员们都是大忙人, 既没有时间,也没心情去教新用户 如何使用 Unix。此外,当时的主流文化 鼓励任何人创造新工具,并与 其他用户分享。于是,一个月接一个月, 一个人可能需要学习的材料在不断增加, 新用户的人数也是如此。 为了应对这些需求,Unix 开发者们采用了两步走的解决方案。 首先,他们创建了一个内置于 Unix 本身的 在线手册,其中包含有关每个 Unix 工具的 信息。由于 Unix 手册本身就是 Unix 的一部分, 它对所有用户永远可用。 这意味着,例如,当一位远方的用户在 半夜遇到问题时,他或她也能 求助于手册。 解决方案的第二部分,是营造一种 工作环境,在这种环境中,所有 Unix 用户 无论是新手还是老手 都应当先试着自己回答问题,然后再去 求助。准确地说,我们所谓 的 Unix 传统要求你自学成才, 自己解决自己的问题。不过,如果你已经 尽了全力仍然有问题,其他 Unix 人士 会很乐意帮助你。反过来,这也意味着,一旦你 有了经验,你也应当去帮助他人。 这一 Unix 传统之所以重要,有两个 原因。首先,它为 Unix 的传播提供了一种 高效的方式。由于人们只在真正需要时才 寻求帮助,有经验的人就不必把时间 浪费在不必要的助人上。 其次,通过让人们承担自学的责任,Unix 开发者 鼓励了那种独立思考和个人创造的精神, 正是这种精神使 Unix 蓬勃发展。事实上, Unix 传统培养了一代又聪明又独立、 又愿意(在必要时)帮助他人的用户, 所有人都工作在一种协作创造的氛围中。 例如,如果一位程序员想要一个新工具, 人们会鼓励他自己动手创造。 程序一旦完成,就会被加入 通用的 Unix 系统。 随后程序员要撰写相关文档, 文档会被收入在线手册。 新工具会向整个 Unix 社区公布, 而大家默认:想学如何使用它的人 会去阅读在线手册、动手试验、自学成才。 如果用户发现了 bug 或遇到严重问题, 他或她可以随时联系程序的作者。 由此可见,Unix 传统建立在两个 核心观念之上:求助之前,先尽全力自学; 当别人向你求助时,要乐于付出你的时间。 这些观念重要到凝结成了一个 非常古怪的词:RTFM。 名称的由来(What's in a Name?) Online(在线) 早年间,ONLINE(在线)一词用来 描述与某个特定计算机系统相连的状态。 例如,当你登录了一个系统, 我们会说你处于在线状态。 当我们谈到在线 Unix 手册时,用的就是这个 含义。手册之所以是"在线"的, 是因为它对某个特定 Unix 系统的所有 用户都可用。 如今,我们也用 "online" 一词来表示某个资源 或某个人接入了互联网,而不是连到某个特定的 计算机系统。例如,一旦你连上网络,就可以使用 网上银行、在线付账单,甚至可以发展 一段网络恋情。 因此,作为一名 Unix 用户,你在两种 不同的意义上是在线的:你登录了某个特定的 Unix 系统,同时你也接入了互联网。
RTFM 这个词在几个方面都很独特。 首先,它是英语中最长的不含元音的动词。 其次,它通常全部用大写字母拼写。 最后,因为 RTFM 没有元音, 这个词要按四个独立的字母来读 ("R-T-F-M"),尽管它并不是一个 首字母缩略词。 如我所说,RTFM 是个动词。(它的 来历我稍后解释。)我们用这个词来体现 这样一种理念:在你求助或查找信息 之前,必须先试着自己解决问题 或自己找到信息。 RTFM 这个词有两种用法。首先, 你可以告诉别人:在他没有帮助自己之前, 不要来麻烦你。 例如,如果有人对你说:"你能教我 怎么用 whatis 命令吗?" 你可能会回答:"RTFM。"在这种情况下, RTFM 的意思是:"查过在线 Unix 手册 之前,别来求助。" 其次,你也可以用 RTFM 表示 你在求助之前已经试着自己解决问题。 例如,你可以给朋友发一封电子邮件: "你能帮我让我的 Linux 系统与一台 Windows PC 共享文件吗?我已经 RTFM'd 整整两天了,可是不每隔几个小时 重启一次 Windows 还是搞不定。" 从早年起,RTFM 的理念就是 Unix 文化 不可分割的一部分。 如今,它在互联网上也广为使用,尤其是在 Usenet 和开源社区。(关于开源运动的讨论, 参见第 2 章。)随着 RTFM 用法的扩展, 它的含义也在扩展。如今,RTFM 的准则 要求你去寻找信息 不仅是在 在线 Unix 手册里 也要在互联网上找。 因此,在你至少用搜索引擎(比如 Google) 搜索过相关网站之前,最好不要开口求助。 就 Usenet 而言,如果你是某个讨论组的新成员, 大家期望你在发出第一篇帖子之前,先阅读 该组的 FAQ(常见问题列表)。 这同样被视为 RTFM。 提示 当你在为 Unix 问题寻找解决方案时, 别忘了 Usenet,那个全球性的讨论组系统。 搜索 Usenet 最简单的方法是使用 Google 的 Usenet 存档,即 Google Groups。 我常常通过搜索 Usenet 存档,找到即使是最 冷僻问题的答案。 如果搜遍了所有地方还是找不到你想要的, 你可以在合适的讨论组里发布请求。 如果这样做,一定要说明你已经 RTFM 过了。 名称的由来(What's in a Name?) RTFM, RTFM'd RTFM 是个动词,表达的是一种理念:当你要 找信息或正在解决某个问题时,你应该先花些时间 试着自己找到所需的东西,然后再向别人 求助。 当我们说已经做过这样的努力时,使用这个动词的 过去分词,拼作 RTFM'd,而不是 RTFMed。 所以你可能会说:"我已经 RTFM'd 两个小时了, 还是搞不明白怎么把我的猫接上互联网。" 和许多技术词汇一样,RTFM 最初也是一个 首字母缩略词。在 Unix 的早期,RTFM 代表 "Read the fucking manual,"(*) 当然,指的是在线 Unix 手册。然而今天,RTFM 已不再是 缩略词,而是一个自身成立的 正规词汇。 这并不罕见。许多其他技术词汇也是如此, 比如 radar("radio detection and ranging",雷达)、 laser("light amplification by stimulated emission of radiation",激光),以及 scuba("self-contained underwater breathing apparatus",潜水水肺); 以及各种专有名词,如 Nato("North Atlantic Treaty Organization",北约), 和集合名词,如 yuppie("young urban professional",雅皮士)。 RTFM 与其他这类词最大的区别在于,RTFM 通常 用大写字母拼写。这再合理不过了,因为 RTFM 对我们文化的重要性,远超 radar、laser、scuba、 Nato 或雅皮士。 * 脚注 有时你会看到 RTFM 被用委婉语解释为 "Read the fine manual"(阅读优秀的指南)。 然而,如你所知,我在本书中的做法是 如实解释事物。在这种情况下,你可以看到, RTFM 的原始含义使用了脏话, 我认为你应该了解真相。感谢 你没有生气。
UNIX 手册,常被称为 在线手册,或更简单地 称为手册,是一组文件的集合,其中每个文件 包含关于一个特定 Unix 命令 或主题的文档。每个 Unix 系统都配有手册,任何用户 随时都可以访问。要使用手册,你只需 输入一条简单的命令(我们马上就会 讲到)。你请求的信息随后会 一屏一屏地呈现给你。 在(大型机的)旧时代, 大多数计算机系统都配有大量高度技术性的 印刷文档,集中存放在某个地方, 比如计算机房或终端房。这些文档 不仅用起来笨拙,而且还经常过时, 人们还常常要应付一摞 打印出来的更新页。正因如此,早期的计算机手册 存放在又大又笨重的活页夹里,虽然 可以打开来插入新页,但总体上 用起来或从一处搬到另一处都很不方便。 Unix 则不同。从一开始,文档就总是在线的, 这意味着任何用户都能在自己的终端上, 随时方便地阅读自己需要的任何东西。此外, 由于在线手册以磁盘文件集合的形式存储, 添加新材料只需增加一个新文件,更新现有材料 只需修改一个文件,都是很简单的事情。 在非常早期,Unix 系统除了在线手册之外也有印刷手册。 不过,印刷手册中的信息与线上已有的内容 完全相同。 访问 Unix 手册很容易。你只需输入 man 这个词,后面跟上你想了解的命令名称。 Unix 就会显示该命令的文档。 例如,要显示关于 cp(复制文件) 命令的文档,请输入: man cp 假设你想了解 man 命令本身。 只需输入: man man 提示 man 命令是最最重要的 Unix 命令,因为你可以用它来了解任何其他命令。 如果你想了解不止一个命令名,只需把所有名字 写在同一行上。例如: man cp mv rm Unix 会依次显示每个命令的文档。 顺带一提,这三个命令分别用于复制、 重命名 [move,移动] 和删除 [remove,移除] 文件。 我们将在第 25 章正式认识它们。 名称的由来(What's in a Name?) The Manual(手册) Unix 手册一向举足轻重。 确实,曾几何时,当 Unix 主要还是 AT&T 贝尔实验室的产品时,Unix 的各个版本 就是以当时手册的版本来命名的:Unix 第六版、 Unix 第七版,依此类推。 尽管 Unix 书籍和参考资料汗牛充栋, 但当一位 Unix 人士提到"手册"时,你可以断定 他或她说的是唯一的那本在线 Unix 手册。例如,假设你正在读系统管理员发来的 一封电子邮件,介绍他刚在系统上 安装的一个新程序。在邮件末尾,他写道: "更多信息,请查阅手册。"你可以不用问就知道, 他是想让你用 man 命令去阅读在线 手册中的相应条目。 对 Unix 用户来说,手册指的就是那本手册, 从来毋庸置疑。
在非常早期,Unix 用户使用的终端很慢, 输出是打印在纸上的。由于 没有显示器,当有人想了解某个命令时, 他或她必须把在线手册的相关页面 打印出来。这并不像听起来那么不便, 因为当时手册的条目并没有那么多, 而且许多条目都是按单页 来设计的。 如今,Unix 手册已有大量 条目,其中许多远比一页印刷页长得多。 尽管如此,人们仍然习惯把单个条目 称为一页(PAGE),或更正式地 称为手册页(MAN PAGE),无论它有多长。 例如,Bash(Linux 默认 Shell, 我们将在第 12 章认识它)的文档 长达 4500 多行。即便如此, 它仍被视为一个单独的手册页。 来看一个用词的例子。你坐在一家 Unix 酒吧里,大口灌着一杯含咖啡因的 热巧克力奶,偶然听到两位程序员在交谈。 第一位说:"我拿不定主意情人节 该送我女朋友什么。你有什么主意吗?" 另一位程序员回答道:"为什么不给她打印一份 Bash 的手册页呢?"
在线手册里几乎每个条目 都比屏幕的行数要长。如果一次性 显示整个条目,它的大部分会飞快地 滚出屏幕,让你根本来不及 阅读内容。 这是一种常见情形,而 Unix 有一个 很好的解决方案:把输出交给一个更细致地 显示输出的程序,一次显示一屏。 这样的程序有三款,称为分页程序, 在 Unix 系统上被常用。 它们的名字是 less、more 和 pg。 最好用 —— 也是使用最广的 —— 分页 程序是 less,我们将在第 21 章 详细讨论它。眼下,我先给你一个 简要概述,让你有足够的能力去阅读 在线手册。 如果你想边读边练,请输入下面几条命令之一, 每一条都会显示某个特定 Shell 的信息: Bash、Korn Shell 或 C-Shell:
man bash
我的建议是,显示你打算使用的、 或你的系统上大多数人使用的 Shell 的 手册页。如果拿不准,随便挑一个就行 这只是练习。 分页程序的工作是一次显示一屏数据。 每显示一屏,程序就会暂停,并在屏幕 左下角显示一个提示符。提示符因所使用的 分页程序而异。 less 和 pg 程序显示一个冒号: : 在某些系统上,less 会显示一条消息 而不是冒号。例如: byte 1357 在这种情况下,less 是在告诉你, 它刚刚显示到第 1357 个字符。 (每个字节存放一个字符。)随着你 逐页翻阅文件,这个数字会不断增大, 让你大致了解自己离开头 有多远。 more 程序显示的提示符包含 "More"这个词。例如,你可能会看到: --More--(10%) 这表示后面还有内容,而你已读完了 全文的 10%。 看到提示符后,你可以按 <Space> 键 显示下一屏信息。(用 pg 时,按 <Return>。)阅读完毕时,按 q (字母 "q")退出。 在阅读手册页时,有许多命令可以使用。 不过通常你并不需要它们。大多数时候, 你只要按 <Space>,一屏接一屏 读下去即可。当你读到页尾, 或者找到你想要的东西时, 按 q 退出。 有时你可能会用到其他一些命令, 所以我花一点时间介绍我认为最有用的 几个命令。这些命令汇总在Figure 9-1 中。 如我所说,还有很多其他命令, 多到你永远用不完。注意: Figure 9-1 中的命令适用于使用 less 的 系统。如果你的系统使用 more 或 pg, 会有一些差别。如果遇到问题,用 h 命令获取帮助。
对任何程序而言,最重要的命令 都是显示帮助信息的那一个。 在这里,你只需按 h(字母 "h")。 一按下去,手册页的内容就会被 所有分页命令的摘要所取代。读完 帮助信息后,按 q 退出并返回 手册页。注意:这份摘要相当长, 就像手册页本身一样,你得按 <Space> 才能把信息 逐屏读完。不过,最重要的命令 都在摘要靠前的位置。 我接下来要讲的命令针对的是 less 分页程序,因为大多数 Unix 系统 都在用它。如果你的 man 命令使用的是 more 或 pg,你只要按 h, 就能得到那个分页程序对应的帮助摘要。 我的建议是,一边阅读,一边在电脑上 跟着操作,试试各种命令。 首先,如果你在寻找某个特定模式, 按 /(斜杠)字符,键入该模式, 然后按 <Return>。例如: /output<Return> 这个例子告诉分页程序跳到下一处 包含 "output" 这个词的行。一旦指定了 某个模式,你可以只按 / 字符 再次搜索它: /<Return> 如果你搜索某个模式,但找到的不是 你要的那一行,你可以一遍又一遍地 继续搜索同一个模式,直到找到 你真正想要的内容。只要反复按 /<Return>(*)即可。 * 脚注 这个特性取自 vi 编辑器,我们将在第 22 章学习它。 另外,你也可以按 n(next,下一个) 来搜索同一个模式,一次或多次都行。 要向后搜索,用 ? 代替 /。例如: ?output<Return> 要向前搜索同一个模式,单独使用 ?: ?<Return> 另外,你也可以按 N 向前搜索同一个模式。 要向下翻一屏,如你所知,按 <Space>。 也可以按 f(forward,向前)。 要向上翻一屏,按 b(backward,向后)。 另外,你还可以按 <PageDown> 和 <PageUp> 上下翻页。 要一次下移一行,按 <Return> 键 或 <Down> 键(即下箭头键)。 要一次上移一行,按 <Up> 键 (即上箭头键)。 要跳到页首,按 g("go to top", 跳到顶部)。要跳到页尾,按 G ("go to bottom",跳到底部)。
我们到目前为止所讨论的阅读手册页的 方法,在概念上很简单:你用 man 命令显示某个特定主题的信息, 然后一屏接一屏地查看这些信息, 直到找到你想要的东西。 这是用标准 Unix CLI(命令行界面) 阅读手册页的常规方式。不过,如果把 man 命令与 Unix 工作环境 结合起来,你就能以更老练的方式 访问手册页。 正如我们在第 6 章讨论过的,你可以用 两种方式操作 CLI:终端窗口或虚拟控制台。 我的建议是,学会同时使用两个终端窗口, 一个用来干活,另一个用来显示手册页。 例如,假设你在一个终端窗口里工作, 用 vi 文本编辑器编辑一个文件 (见第 22 章)。你需要一些帮助, 于是决定查看 vi 的手册页。 如果你在一个第二个终端窗口里显示这一页, 就能同时看到手册页和原来的窗口。 Figure 9-2 展示了这种情形。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Figure 9-6: Unix 手册中的一页示例
MAN(1) USER COMMANDS MAN(1)
NAME
man - display reference manual pages; find reference pages
by keyword
SYNOPSIS
man [-] [section] title ...
man -k keyword ...
man -f filename ...
DESCRIPTION
Man is a program which gives information from the programmer's manual.
It can be asked for one-line descriptions of commands specified by
name, or for all commands whose description contains any of a set of
keywords. It can also provide on-line access to the sections of the
printed manual.
When given the option -k and a set of keywords, man prints out a
one-line synopsis of each manual section whose listing in the table
of contents contains one of those keywords.
When given the option -f and a list of names, man attempts to locate
manual sections related to those files, printing out the table of
contents lines for those sections.
When neither -k or -f is specified, man formats a specified set of
manual pages. If a section specifier is given man looks in that
section of the manual for the given titles. Section is either an
Arabic section number (3 for instance), or one of the words "new",
"local", "old" or "public". A section number may be followed by a
single letter classifier (for instance, 1g, indicating a graphics
program in section 1). If section is omitted, man searches all
sections of the manual, giving preference to commands over subroutines
in system libraries, and printing the first section it finds, if any.
If the standard output is a teletype, or if the flag - is given, man
pipes its output through more(1) with the option -s to crush out
useless blank lines and to stop after each page on the screen. Hit a
space to continue, a control-D to scroll 11 more lines when the
output stops.
FILES
/usr/man standard manual area
/usr/man/man?/* directories containing source for manuals
/usr/man/cat?/* directories containing preformatted pages
/usr/man/whatis keyword database
SEE ALSO
apropos(1), more(1), whatis(1), whereis(1), catman(8)
BUGS
The manual is supposed to be reproducible either on a photo-typesetter
or on an ASCII terminal. However, on a terminal some information
(indicated by font changes, for instance) is necessarily lost.
|
|
开始讨论之前,先快速浏览一遍每个 基本标题。如我所说,你偶尔也会看到 其他标题,但只要有了一点经验, 理解这些变化就不成问题。 Name:这是对该命令或功能的一行 概述。要知道,有些概述语焉不详; 如果你看糊涂了,可能还得再多 RTFM 一番。 Synopsis:这一部分展示命令的语法, 即关于如何输入该命令的正式说明。 我会在第 10 章详细讲解命令语法, 所以大部分内容留到那时再谈。 眼下,我只想请你注意一点。 一般来说,输入一条命令时,你先键入名字, 接着是选项,然后是参数。技术细节我们 留到第 10 章再讨论,现在不必操心。 我只想让你明白:Synopsis 部分 展示选项时有两种写法。 第一种可能,你只看到一个词 OPTION。这时,实际的 选项列在下方的 Description 部分中, 并在那里得到解释。这里有一个例子, 摘自 Linux 上 ls 命令的手册页: ls [OPTION]... [FILE]... 这种约定用于随 GNU 工具而来的 手册页(参见第 2 章)。由于 GNU 工具 几乎在所有 Linux 系统上都在使用, 所以在许多 Linux 手册页上 你都会看到这种写法。 再看两个例子。第一个摘自 FreeBSD 手册; 第二个摘自 Solaris 手册。
ls [-ABCFGHLPRTWabcdfghiklmnopqrstuwx1] [file...]
这时,实际的选项都已明列。 (你在Figure 9-6 中看到的手册页示例也是如此。) 与上面的例子一样,细节在 Description 部分中解释。 Synopsis 的职责只是提供 命令的快速概要。 Description:这一部分是篇幅最大的, 通常占据手册页的主体。它的目的是 解释你需要知道的大部分细节, 包括如何使用各个选项。在某些系统上, 完整说明被分为两个独立的部分: Description 和 Options。 阅读时,记住你看的是一部参考手册、 而不是教学指南,会有助于理解。 要做好心理准备:很多描述在你 没弄清自己在干什么之前都很难看懂。 这很正常。如果觉得吃力,就继续读, 读到你失去耐心为止:你读到的内容 总会留下一些印象。等学得更多时, 可以再回来试一次。 还要认识到,有些描述(比如各种 Shell 的 描述)你恐怕永远都看不明白。 如果这让你不安,提醒自己一句: 那些把 Unix 手册全都搞懂的人, 无论是魅力还是社交能力,都远不如你。 Files:这一部分列出该命令所使用的 文件名。如果这部分的信息让你摸不着头脑, 可以忽略它。(我们将在第 23 章详细 讨论文件名。) See also:这是一个重要的部分。 它告诉你在手册中还能去哪里查找更多信息。 尤其你会看到与所讨论的命令有某种关联的 命令。顺着这些引用去查证, 是很好的学习方法。重点关注 指向第 1 节手册页的引用。 Environment:在解释这一部分之前, 我需要先为"变量"这个概念打点基础。 变量是一种既有名字又有值的实体。 在 Unix 内部,有一些变量的值 对所有程序和 Shell 脚本都可用。(Shell 脚本 是一个包含命令列表、可被自动执行的文件。) 这类变量随上下文不同有好几个名字: 环境变量、全局变量或 Shell 变量 (见第 12 章)。按照惯例,环境变量和 全局变量的名字全部使用大写字母。 手册页的这一部分描述该程序所使用的 环境变量。例如,date 命令的手册页 提到一个名为 TZ 的环境变量, 它指明应当使用哪个时区。 Author:参与该程序工作的一位或多位 人员的姓名。在查看 GNU 工具的 手册页时,你常会看到这个部分。 这是因为负责 GNU 项目的自由软件基金会 (参见第 2 章)乐于把功劳归于程序员。 Diagnostics:这一部分可能包含 两类信息。其一,可能是对可能出现 的错误信息的解释。其二,可能是一个 命令结束时会返回的错误代码列表。 对于想从程序或 Shell 脚本中调用某个命令、 然后再测试命令是否成功结束的程序员来说, 错误代码十分重要。如果命令成功, 错误代码的值为 0(零)。 否则,错误代码为非零。 Bugs:所有程序都有两类 bug: 一种是你知道的,另一种是你不知道的。 Unix 的最初开发者认识到没有程序是完美的, 用户有权知道这些不完美之处。因此, 许多手册页都设有专门记录已知问题的部分。 一些商业 Unix 厂商认定,一个名为 Bugs 的部分会让付费客户 产生不好的联想。于是,你可能会看到 这一部分隐姓埋名,改叫 Notes 或 Limitations 之类。别被骗了: bug 就是 bug,只要你用这个程序, 你就有权知道它们。
当你输入 man 命令时,Unix 会显示 整个手册页。然而有时你只想要 一个简单的描述。这种情况下, 你另有一条路可走。 如我上文所解释,手册页的 Name 部分包含一行描述。如果你只想看 这一行,请输入 man -f, 后跟一个或多个命令的名字。例如: man -f time date 在这种形式的 man 命令中, -f 称为一个选项。(选项将在 第 10 章讨论。)字母 f 代表 "files"一词。每个手册页都存放在 单独的文件里;当你使用 -f 选项时, 你是在告诉 man 该查看哪些文件。 为了方便起见,你可以用 whatis 命令作为 man -f 的同义词。 例如,你想显示时间,但拿不准该用 time 还是 date, 输入这两条命令中的任意一条:
whatis time date
你会看到类似这样的输出:
date (1) - print or set the system date and time
你可以忽略最后两行,因为它们指的 不是手册的第 1 节。看前两行, 你会发现你要的命令是 date。 time 命令实际上是用来测量 一个程序或命令执行多快。 如你所知,输入 man 命令时, 你可以指定一个特定的节号 (如 man 1 date)。但用 man -f 或 whatis 时, 就不能这么精确了。Unix 总会 搜索整部手册。 因此,了解你的手册里有什么内容, 一个好办法是输入: whatis intro 你会看到每个 intro 页的 简要概述。(试一下。) 注意:要让 whatis 命令正常工作, 手册页必须以某种方式预先处理。 这包括收集所有一行描述,并把它们 存放在特定的文件里。whatis 搜索的 正是这些文件,而不是手册本身 (那样就太慢了)。如果没有做预先处理, whatis 就返回不了有用的信息。 如果你的系统是这种情况,请去找 系统管理员谈谈。
当你想了解某个特定命令时,可以用 man 显示该命令的手册页。 可如果你知道自己想做什么,却不确定 该用哪个命令,怎么办? 解决办法是给 man 加上 -k 选项。它会搜索 NAME 部分含有指定关键词的命令。(字母 k 代表 "keyword",关键词。)例如, 假设你想找出手册中所有与手册本身 有关的条目。输入: man -k manual 为了方便起见,你可以直接用 apropos 这一个词,作为 man -k 的同义词: apropos manual 注意:读 apropos 这个词时, 重音在最后一个音节上,而且 "s" 不发音:a-pro-poe'。这是因为该词 源自一个法语表达,而在法语中, 词尾的 "s" 通常不发音(*)。 * 脚注 法国人擅长拼写,却不擅长发音。 apropos 命令搜索所有一行 命令描述,寻找包含你所指定的 那一串字符的条目。为了让命令 更强大,Unix 不区分大小写。 下面是上一个例子的部分输出。
catman (8) - create the cat files for the manual
请注意,值得关注的命令有两条:man 和 whereis,因为只有它们位于第 1 节。 另外请注意,route 命令之所以被列出, 只是因为 "manual" 这几个字母恰好 出现在它的描述里。 你可能会问,为什么 apropos 和 whatis 没有出现在这个列表里? 毕竟这两条命令都帮助你访问在线手册。 要回答这个问题,请输入: whatis apropos whatis 你会看到,"manual"一词并没有 出现在这些描述里:
apropos (1) - locate commands by keyword lookup
这里的教训是:apropos 命令 不是魔法 它能做的只是盲目地 搜索字符串 所以如果找不到 你想要的,就换一种问法再试试。 提示 大多数命令实际上是程序。例如, man 命令其实就是一个名叫 "man" 的 程序。不过,一些最基本的命令称为 内建命令(builtin commands),由 Shell 自己执行。这些命令的文档写在 Shell 的手册页里,在手册中不会有 单独的条目。 如果你在找一个你明知存在的命令, 却搜不到它自己的名字,就去查查 你的 Shell 的手册页:
man bash
如果你使用 Bash,有一个特殊的手册页 会列出所有内建命令: man builtin 名称的由来(What's in a Name?) Apropos 在 Unix 中,apropos 命令是 man -k 的同义词。这个词 源自法语表达 à propos,意为 "与……相关"。在英语里,"apropos" 是介词,意思是"关于"或"提及"。例如, 你可能会在小说里读到这样一段: "...安布尔挑起眉毛,探过身去,轻轻碰了碰 那位高大英俊的程序员的双唇。她甩动金色的 长发,只觉得一阵渴望的战栗掠过她精瘦柔美的 身体。'Apropos(关于)你的提议,'她眨着 睫毛,妩媚地呢喃道,'我真想当你那场 Unix 单身汉派对的司仪。不过,克里斯汀知道这封 邀请函的事吗?'..."
有两个妙不可言的词,你时不时会撞见:FOO 和 BAR。程序员们用 这些词作为通用标识符。不仅在整个 Unix 和 Linux 世界里会看到它们,在 Web 和 Usenet 讨论组里也能见到。 其思路是:每当你要提及某个没有名字的 东西时,就叫它 "foo";当你要提及两个 没有名字的东西时,就叫它们 "foo" 和 "bar"。 没人确切知道这一传统从何而起, 但它的使用极为广泛。 例如,下面是 Linux 上 exec 命令 手册页的一段摘录。(别在意含义。) "...Most historical implementations were not conformant in that foo=bar exec cmd did not pass foo to cmd..." 你偶尔也会看到 FOOBAR 一词以同样方式 被使用。例如,下面是一位著名的 Unix 教授为他的期末考试出的一道题。 (同样,别在意含义。) "……给出一条 Unix 命令,以及在 sed 和 awk 中的等价写法, 完成下面这些任务:把名为 foobar 的 文件打印到标准输出,但只打印第 4 到 20 行 (含两端)。打印 foobar 文件的 所有行,但只打印第 10 到 25 列 (含两端)……" 名称的由来(What's in a Name?) Foo, Bar, Foobar 在 Unix 世界和互联网上,foo、bar 和 foobar 这些词常被用作通用术语, 代表讨论或论述中没有名字的事物。 这些奇怪的词是从哪里来的? "foobar"一词源自首字母缩略词 FUBAR, 这个词在二战期间很流行。FUBAR 的意思是 "fouled up beyond all recognition" (烂得没救了)(*). "foo"一词的历史似乎更为悠久。毫无疑问, foo 的流行要归功于 foobar。不过,foo 似乎更早就被单独使用了。例如,在 1938 年 的一幅卡通里,达菲鸭举着一块牌子, 上面写着 "Silence is Foo"(沉默即是 foo), 这话说得绝对正确。一些权威人士推测, foo 可能源自意第绪语的 "feh" 和 英语的 "phoo"。 * 脚注 其实,FUBAR 里的 F 并不代表 "fouled"。 不过,我想在同一章里用两次 "fuck" 这个词可能会冒犯人(参见关于 RTFM 的讨论)。 我相信你能理解。
Info 是一个在线帮助系统,独立于 Unix 手册之外,用来为 GNU 工具编写 文档(第 2 章有解释)。由于许多类型的 Unix 包括几乎所有的 Linux 系统 都使用 GNU 工具,大多数人发现 同时了解在线手册和 Info 的用法很有用。 事实上,你会发现许多 Linux 手册页 都会把你引向 Info 以获取更多信息。 从表面上看,Info 和在线手册有几分相像。 信息存放在文件里,一个主题一个文件, 就像手册页一样。这些文件称为 Info 文件(INFO FILES),要阅读它们, 你使用 info 程序。只需键入 info,后跟一个命令的名字。 看下面两个例子。第一个显示 date 命令的手册页;第二个显示 同一命令的 Info 文件:
man date
和在线手册一样,info 会一次 一屏地显示信息。和手册一样,你按 <Space> 翻到下一屏,按 q 退出。不过,正如你马上会看到的, 两者的相似之处仅此而已。 如果你启动 Info 有困难,可以通过查找 info 程序来确认你的系统上有没有 Info。下面任何一条命令都能办到 (参见第 7 章):
which info
另外,你也可以查找 info 的 手册页: man info 如果你的系统上既没有 info 程序, 也没有 info 手册页,你就可以断定 自己没有 Info(这意味着你可以放心地 跳过本章余下的内容,心安理得地知道 自己的生活并没有错过什么)。 如你所知,所有 Unix 和 Linux 命令 都有手册页。然而,许多命令并没有 Info 文件。因此,如果你试图显示某个 没有 Info 文件的命令的 Info 页, Info 会干脆把手册页拿给你看。例如, man 命令就没有 Info 文件。 看看输入下面命令会发生什么: info man Info 与在线手册之间有三个主要区别。 首先,Info 文件里不仅包含信息, 还包含指向其他 Info 文件的链接。 因此,阅读 Info 页面有点像阅读网页: 你可以用链接跳到另一个文件。(*) 手册页则做不到这一点。 * 脚注 与网页不同,Info 文件只包含纯文本, 几乎没有排版,也没有图片。 因此,当你使用 Info 时,你可以体会到 早期的 Web 是什么样子 那时它还 是一个原始的、基于文本的系统。 其次,在查看 Info 文件时,你可以使用 大量命令,远多于在线手册 所能提供的。这使得环境强大得多。 正因如此,有些人宁愿用 info 而不是 man 来查看手册页。 最后,正如我在本章开头所描述的, 在线手册出自贝尔实验室最初的 Unix 程序员之手。他们的目标是让一切 保持简单,既为撰写文档的程序员, 也为阅读文档的用户。Info 则由 Emacs 文本编辑器的开发者们创造。 首席架构师是 Richard Stallman, 自由软件基金会和 GNU 项目的创始人 (参见第 2 章)。 Stallman 于 20 世纪 70 年代初在 MIT 人工智能实验室受训,那里的环境 与贝尔实验室大不相同。最重要的 差别之一是:MIT 倾向于构建庞大、 复杂、强大的系统,而 Unix 程序员 (预算少得多)则看重简单。对比一下 Multics 和 Unix(参见第 1 章) 就知道了。 尽管 Stallman 不是典型的 MIT 程序员, 但他写的程序确实功能极强、个性十足, 并且带有大量晦涩的命令。在 Emacs 和 Info 中,你很大程度上都能看到这些特点。 所以,当你阅读本章余下内容、动手 练习 Info 时,请记住:给你提供 Info 的, 正是创造 Emacs 的那批人。如果你觉得 有点晕,可以自我安慰:所有人第一次 用 Info 时都是这个感觉。 Info 虽然复杂,实际上是某个更大东西的 一部分,这个东西叫 TEXINFO,是 GNU 项目的官方文档系统。Texinfo 是一套 精密的工具,让你用单一的信息文件 生成多种格式的输出:Info 格式、 纯文本、HTML、DVI、PDF、XML 和 Docbook。 就我们的目的而言,只需要知道: GNU 文档最初是 Texinfo 文件, 随后被用来生成 Info 文件。正因如此, 你有时会把 Info 听作 Texinfo。例如, 如果你向某人请教一个问题,他反问: "你查过 Texinfo 了吗?"他就是在告诉你 去用 Info。 由于 Info 如此复杂,我们不可能面面俱到, 其实也没必要。相反,我只给自己定了 三个主要目标,向你展示:如何用 Info 显示你想要的东西,如何在 Info 系统里 四处移动,以及如何显示 Info 的帮助信息。 掌握这三样本事,你就可以按需 RTFM, 自学任何你需要知道的东西。 名称的由来(What's in a Name?) Texinfo 初看 Texinfo 这个名字,你可能会以为 它应该拼作 Textinfo。毕竟, 它是一个基于文本的信息系统的名字。 其实,Texinfo 的拼写是对的:它来自 TeX,一个由杰出计算机科学家 Donald Knuth(读音为 "kuh-NOOTH") 创造的排版系统。 TeX 这个名字来自希腊语单词 techni,英语单词 "technical" 即由此而来。Techni 指一种艺术、 一种手艺,或更宽泛地说,指某人努力的 最终成果。因此,TeX 这三个字母不是 英语字母 T-E-X,而是希腊字母 Tau、Epsilon 和 Chi,即 techni 的前三个字母。如果你想讲究到极致, Chi 应当读作苏格兰语 "loch" 或 人名 "Bach" 里的 "ch" 音。不过, 大多数电脑人士把 Chi 读作 "K"。 那么,你该怎么读 Texinfo 呢? 你有四种选择。 第一,如果你喜欢讲究到极致, 你应该读作 "Te[ch]info",其中 [ch] 就是我上面描述的那种奇特的音。 如果你是程序员,想显得是圈内人, 就读 "Tekinfo"。 如果你想融入非技术人群,就读 "Texinfo",大多数按字面读这个词的 人就是这么读的。 最后,如果你想在自己的社交圈里 当领袖,就告诉所有人:这个名字显然 应该叫 "Textinfo"。你说,第二个 "t" 准是不小心漏掉了,早该有人 把这个错误改正过来。 (实际上,你说得也许没错:一个人 发明了某样东西,并不等于他就有权 为了显示自己多聪明而给它起一个 愚蠢的名字。)(*) * 脚注 我此生既有幸结识为 TeX 命名的 Donald Knuth,也结识了为 GNU 命名的 Richard Stallman。如果把他俩关进 同一间屋子,他们俩大概唯一能达成 一致的,就是 TeX 和 GNU 都是好名字。
你可能还记得,在第 8 章我们讨论过 数据结构的观念,这是计算机科学的一个 基本概念。数据结构是一种按照一组 精确规则来存储和检索数据的实体。 当时我提到,最常见的数据结构类型 有列表、链表、关联数组、哈希表、 栈、队列、双端队列(deque),以及 各种基于树的结构。 在第 8 章,我们讨论过栈,以便理解 dc 计算器如何处理逆波兰表示法。 在本节中,我们要讨论树,因为树正是 Info 用来存储和检索 Info 文件的 数据结构。一旦你理解了树,你用来 控制 Info 的命令就说得通了。如果你 不懂什么是树,你当然也能用 Info, 但既没乐趣,也不轻松。 当计算机科学家谈到树时,他指的是 一大类复杂的数据结构。所以,为了 简化生活,我们先从一个简单的比喻开始。 假设你决定去远足。你从登山步道 的起点出发,发现有好几条路可走。 你选了其中一条。你沿着它走, 直到来到一个岔路口,此时又有几条 新路供你选择。你再次做出选择, 继续前行,直到又来到一个岔路口, 不得不做出另一个选择。如此反复。 偶尔,你会走上一条通向死路的小径。 这时你就得回到之前的岔路口, 换一条路走。 用计算机科学的话说,我们把每个 岔路口称为节点(NODE)。主节点 (我们例子里的登山步道起点)称为 根(ROOT)。连接两个节点的路径称为 分支(BRANCH)。当一条分支通向 死路时,它是一种特殊的节点, 称为叶(LEAF)。 下面是技术定义:在计算机科学家眼中, 树(TREE)是节点、叶和分支的集合, 其组织方式保证任意两个节点之间 至多只有一条分支。(*) * 脚注 计算机树背后的思想取自数学中称为 图论的一个分支。数学上的树与 计算机的树相似,但术语不同。 在图论中,节点称为 "vertex" (复数 "vertices"),分支称为 "edge"。 因此,如果你遇到一位图论学家,可以指望 他说出这样的话:"严格说来,Info 系统用的 数据结构并不是真正的树。由于有些 顶点被不止一条边连接,你其实应该把它 描述为一棵嵌入了树状对象的连通图。" (现在你明白为什么 Unix 人士请客 不叫图论学家参加派对了。) 虽然这一切听起来有点复杂,但它 类似于我们观察真正的树时所见的情形。 举个例子,看看Figure 9-7 中的示例树。 注意,与真正的树不同,计算机的树 通常把根画在上面。
在计算机科学中,有各种各样不同类型的 树,各有自己的特点。我刚才描述的 那种树,正是 Info 用来存储信息的 数据结构。 每个 Info 文件被分成若干部,以一系列 节点的形式存储。阅读一个文件时, 你在节点之间移动。这让你能从头到尾 读完整个文件,一次读一个节点。当你 正在查看某个特定节点时,我们说你 正在访问(VISITING)该节点。许多节点 还包含链接(LINKS),让你可以跳到其他 相关的文件(就像网页上的链接一样)。 使用 Info 需要三项基本技巧。你需要了解 如何:
下面我们逐一开始讨论这些技巧。
要启动 Info 系统,你使用 info 命令。它有两种变体。 第一,如果你想显示某个特定命令的 信息,键入 info,后跟命令名。 例如:
info date
如果你不确定想学哪个命令,或者想 在系统里随便浏览,那就单独输入 info 命令: info 以这种方式启动 Info 时,它会显示一个 特殊的节点,称为目录节点 (DIRECTORY NODE)。目录节点包含一份 主要主题的列表,所以你可以把它看作 整个 Info 系统的主菜单。
Info 有相当多的帮助信息可供你阅读, 帮你入门。在动手之前,请务必把本章 读到最后。 旅程的起点是 info 的手册页。 下面任何一条命令都能胜任:
info --help | less
注意,第一条命令里有两个连字符, 而且 help 一词前面没有空格。 这是什么意思,我们将在第 10 章讨论。 读完手册页后,你可以显示一个简短的 Info 入门文件,命令是: info info 接下来,你应当读一读 Info 教程。 方法是:启动 Info,然后按 h (help,帮助)键。这可能有点让人 摸不着头脑,但如果你读了本章, 就不会有问题。 学完教程后,再花点时间显示 Info 的 命令摘要,浏览一下命令列表。 按 ?(问号)键即可显示这份摘要。 提示 任何时候,在任何 Info 文件内部,你都可以 显示内置教程(按 h)或命令摘要 (按 ?)。阅读这些文件时,不必 强求弄懂每一处。先学会基本命令, 等有需要时再扩充你的招式。 说到 Info,没有人知道(也不需要知道) 一切。 使用 Info 时,你眼前永远是一个节点。 如果你想离开该节点,回到上一个 正在阅读的节点,按 l (字母 "L")。 例如,假设你正在阅读包含 date 命令帮助的节点。你按 ? 显示 命令摘要(一个新节点)。要回到 date 节点,只需按 l。 别按 q,否则你会彻底退出 Info,回到 Shell 提示符。 阅读命令摘要时,你会看到 <Ctrl> 键是用 C-x 这种记法表示的,而不是 ^X 或 <Ctrl-X>。(这是 Emacs 的惯例。) 你还会看到 M-x 这种记法。M- 代表 Meta 键,这是 Emacs 中一个非常重要的 概念。目前我只想说,要使用 Meta 键, 你可以在按下第二个键的同时按住 <Alt> 键;或者先按 <Esc>, 松开,再按第二个键。 例如,假设你想按 M-x。 你可以用 <Alt-X>,或者先按 <Esc>,再按 <X>。
在 Info 系统内,你可以使用许多命令。 我已把最重要的命令汇总在Figure 9-8 中, 并将在接下来的几节中逐一讲解。 阅读时,如果你启动 Info 跟着我们 的讨论实测这些命令,会大有帮助。 读完之后,你可以把Figure 9-8 当作参考。
每个 Info 文件都被组织成一棵小树, 由节点的线性序列构成。每个文件的 目的是讲清一个主要思想,比如如何 使用某个特定命令;每个节点则只讲 一个主题。当你开始阅读一个文件时, 你会被放在该文件那棵树的根部。 在 Info 中,树的根称为 Top 节点 (TOP NODE)。 一般而言,Top 节点包含所讨论主题的 概要,以及文件中各主题的列表。 这个列表以菜单的形式呈现。 你可以用两种方式阅读文件。第一, 按顺序一个接一个地读节点,从 Top 节点 读到最后一个节点。或者,如果想读 某个特定主题,你可以用菜单直接 跳到特定的节点。 阅读文件最简单的办法,是从 Top 节点 开始,把整个文件从头到尾读下来。 你只需按 <Space>,它就会一屏接 一屏地显示信息。当你读到一个节点 末尾时,再按 <Space> 就会带你到 树中下一个节点的开头。因此,从 Top 节点开始反复按 <Space>, 你就能走完整棵树。 要向后一屏一屏地回退,按 <Backspace> 或 <Delete> 均可。 如果你位于一个节点的开头并按了 这些键之一,你就会回到上一个节点。 (试一下。) 为了方便,你也可以用 <PageDown> 和 <PageUp> 在节点内移动。然而, 与其他键不同,<PageDown> 和 <PageUp> 只在节点内移动, 不会跳到下一个或上一个节点。因此, 当你想不离开当前节点而上下翻动时, 它们非常顺手。 为了方便,你还可以随时按 b 键 跳到当前节点的开头。 最后,做小幅移动时,你可以使用 箭头(光标)键。<Down> 使光标 下移一行;<Up> 使光标上移一行。 同样,<Right> 和 <Left> 分别使光标向右或向左移动一位。 为了帮助你直观理解 Info 节点与文件 是如何连接的,看看Figure 9-9,它展示了 Info 树的组织方式。起初,这种组织 可能显得复杂。不过,花一点时间弄清 这些连接,会让你驾驭 Info 容易得多。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
提示 阅读 Info 文件最简单的办法,是从它的 Top 节点开始,反复按 <Space>。 这样,你就会一次一个节点地把整个 文件读完。
在阅读 Info 文件时,有好几条命令可以用来 从一个节点跳到另一个节点,既可以在同一 文件内,也可以跳到完全不同的文件。 要跳到当前文件中的下一个节点,按 n; 要跳到上一个节点,按 p。要跳到 当前文件的 Top 节点(开头),按 t。 许多节点,尤其是 Top 节点,包含一份以 菜单形式呈现的主题列表。每个主题实际上 都是一个链接,你可以跟着它走。有些链接 跳到文件内的另一个节点;另一些链接则 跳到完全不同的文件。 你很容易认出链接,因为它们有特定的格式: 一个星号(*),接着是主题名, 再跟一个冒号(:)。冒号之后, 你会看到这个主题的一段简短描述。 有时还会附有一条说明性的注释。 下面是从我上文讲过的 Info 教程中摘取的 两个例子。这些例子正是为了展示典型 菜单项的样子(*):
* Foo: Help-FOO. A node you can visit for
fun.
* 脚注 这些例子直接取自 Info 教程,展示了 "Foo" 和 "Bar" 这两个词如何用作通用名称。 参见本章前面的讨论。 真正的链接是菜单项中从星号到冒号 (含冒号)的那部分。它类似于网页上的链接。 要跟随一个链接,只需把光标移到它上面, 然后按 <Return>。 最简单的办法是按 <Tab>,它使光标移到 节点内的下一个链接;或者按 M-<Tab>(*),使光标移到节点内的 上一个链接。另外,你也可以使用箭头键 (<Down>、<Up>、<Right> 和 <Left>)。 * 脚注 如我早先解释的,M- 指 Meta 键。 要按 M-<Tab>,你可以用 <Alt-Tab>,或者先按 <Esc>, 再按 <Tab>。 无论你怎么到达链接,一旦到了那里, 只需按 <Return> 即可完成跳转。 除了跟随链接,跳转还有另外两种方式。 如我们之前所讨论的,每个 Info 文件都 组织成一棵由节点序列构成的简单树。 实际上,整个 Info 系统就是一棵巨大 的树,它的枝杈直接间接地通向系统里 每一个文件、每一个节点。你可以按 d 跳到这棵巨树的根部 目录节点。 由于目录节点充当整个系统的主菜单, d 命令值得牢记在心。 最后一种跳转方式是按 l(字母 "L"), 离开当前节点,返回你上一个访问过的 节点。例如,假设你跟随一个链接从 文件 A 跳到了文件 B。只要你按 l, 就会跳回文件 A。 l 命令很有用,因为你可以反复按它, 沿着整棵树回退你走过的每一步。这让 你能一步一步地往回走。和 d 命令 一样,l 命令也值得牢记。 提示 尽管 Info 系统很复杂,真正重要的命令 只有七条:
1. <Space>:显示下一屏
只要记住这七条命令,并承诺在需要时 继续学习更多,你就能把 Info 用得很好。
复习问题 #1: Unix 的两大文档系统是什么? 你分别用什么命令访问它们? 复习问题 #2: 在阅读手册页时,如何输入一条单独的 Shell 命令? 复习问题 #3: 在查看 Info 节点时,你分别用什么命令来:
• 显示帮助教程
知识运用 #1: 用 man 命令显示你的默认 Shell 的 手册页(man sh)。页面显示出来后, 完成以下操作:
• 显示下一屏信息
知识运用 #2: 如果你使用的是 Linux 或 FreeBSD,用 info 命令显示关于 Info 系统本身的信息 (info info)。 第一个节点显示出来后,完成以下操作:
• 显示下一屏信息
进一步思考 #1: RTFM 的准则要求人们在求助之前,先通过 阅读文档试着自己帮助自己。这条准则有 哪两大优势?又有哪两大劣势?
© 本书全部内容,2026 年版权所有,Harley Hahn
|