捐赠?

Harley Hahn
个人主页

给 Harley
发送留言


来自 Harley Hahn 的
个人寄语

Unix 之书
主页

搜索

章节列表

目录

插图列表

各章...
   1   2   3
   4   5   6
   7   8   9
  10  11  12
  13  14  15
  16  17  18
  19  20  21
  22  23  24
  25  26

术语表

各附录...
  A  B  C
  D  E  F
  G  H

命令
摘要...

• 按字母顺序
• 按类别

Unix-Linux
年表

互联网
资源

错误与
勘误

推荐语


教师
与学生
资料...

主页
与概述

练习
与答案

Unix 模范
课程与
课程大纲

教师用
PowerPoint 文件

第 9 章...

文档:
Unix 手册与 Info (Documentation: The Unix Manual and Info)

在 Unix 的世界里,有许多 不同的文档系统,每个都有 自己的特点。有些被广泛使用; 有些则服务于某个特定的细分领域。一般来说, 所有这类系统都有两个共同目标: 让程序员易于为自己的工作 编写文档,也让用户易于学习 如何使用程序员创造的工具。

在本章中,我将教你如何使用 两个最重要的 Unix 文档系统:在线 Unix 手册, 这是每个 Unix 系统都自带的功能; 以及 Info,GNU 项目的官方文档系统。

这两种工具都是为配合 Unix CLI(命令行界面) 使用而设计的。 原因在于,图形程序是自文档化的, 也就是说,它们几乎总是有自己的 内置帮助功能。因此,当你想向一个 基于图形用户界面的程序寻求帮助时,不要使用 在线手册或 Info。你应该到程序内部去找, 通常是打开一个 Help(帮助)菜单。

跳至页首

Unix 的自学传统
(The Unix Tradition of Teaching Yourself)

正如我们在第 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 这个词在几个方面都很独特。 首先,它是英语中最长的不含元音的动词。 其次,它通常全部用大写字母拼写。 最后,因为 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 手册?
(What Is the Unix Manual?) man

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 用户来说,手册指的就是那本手册, 从来毋庸置疑。

跳至页首

手册页
(Man Pages)

在非常早期,Unix 用户使用的终端很慢, 输出是打印在纸上的。由于 没有显示器,当有人想了解某个命令时, 他或她必须把在线手册的相关页面 打印出来。这并不像听起来那么不便, 因为当时手册的条目并没有那么多, 而且许多条目都是按单页 来设计的。

如今,Unix 手册已有大量 条目,其中许多远比一页印刷页长得多。 尽管如此,人们仍然习惯把单个条目 称为一页(PAGE),或更正式地 称为手册页(MAN PAGE),无论它有多长。 例如,Bash(Linux 默认 Shell, 我们将在第 12 章认识它)的文档 长达 4500 多行。即便如此, 它仍被视为一个单独的手册页。

来看一个用词的例子。你坐在一家 Unix 酒吧里,大口灌着一杯含咖啡因的 热巧克力奶,偶然听到两位程序员在交谈。 第一位说:"我拿不定主意情人节 该送我女朋友什么。你有什么主意吗?" 另一位程序员回答道:"为什么不给她打印一份 Bash 的手册页呢?"

跳至页首

显示手册页
(Displaying Man Pages)

在线手册里几乎每个条目 都比屏幕的行数要长。如果一次性 显示整个条目,它的大部分会飞快地 滚出屏幕,让你根本来不及 阅读内容。

这是一种常见情形,而 Unix 有一个 很好的解决方案:把输出交给一个更细致地 显示输出的程序,一次显示一屏。 这样的程序有三款,称为分页程序, 在 Unix 系统上被常用。 它们的名字是 lessmorepg。 最好用 —— 也是使用最广的 —— 分页 程序是 less,我们将在第 21 章 详细讨论它。眼下,我先给你一个 简要概述,让你有足够的能力去阅读 在线手册。

如果你想边读边练,请输入下面几条命令之一, 每一条都会显示某个特定 Shell 的信息: Bash、Korn Shell 或 C-Shell:

man bash
man ksh
man csh

我的建议是,显示你打算使用的、 或你的系统上大多数人使用的 Shell 的 手册页。如果拿不准,随便挑一个就行 — 这只是练习。

分页程序的工作是一次显示一屏数据。 每显示一屏,程序就会暂停,并在屏幕 左下角显示一个提示符。提示符因所使用的 分页程序而异。

lesspg 程序显示一个冒号:

:

在某些系统上,less 会显示一条消息 而不是冒号。例如:

byte 1357

在这种情况下,less 是在告诉你, 它刚刚显示到第 1357 个字符。 (每个字节存放一个字符。)随着你 逐页翻阅文件,这个数字会不断增大, 让你大致了解自己离开头 有多远。

more 程序显示的提示符包含 "More"这个词。例如,你可能会看到:

--More--(10%)

这表示后面还有内容,而你已读完了 全文的 10%。

看到提示符后,你可以按 <Space> 键 显示下一屏信息。(用 pg 时,按 <Return>。)阅读完毕时,按 q (字母 "q")退出。

在阅读手册页时,有许多命令可以使用。 不过通常你并不需要它们。大多数时候, 你只要按 <Space>,一屏接一屏 读下去即可。当你读到页尾, 或者找到你想要的东西时, 按 q 退出。

有时你可能会用到其他一些命令, 所以我花一点时间介绍我认为最有用的 几个命令。这些命令汇总在Figure 9-1 中。 如我所说,还有很多其他命令, 多到你永远用不完。注意: Figure 9-1 中的命令适用于使用 less 的 系统。如果你的系统使用 morepg, 会有一些差别。如果遇到问题,用 h 命令获取帮助。

Figure 9-1
阅读手册页:
重要命令
通用命令
q退出
h显示帮助信息
阅读手册页
<Space>显示下一屏
<PageDown>显示下一屏
f显示下一屏
<PageUp>显示上一屏
b显示上一屏
搜索
/pattern向后搜索指定模式
?pattern向前搜索指定模式
/向后搜索上一个模式
n向后搜索上一个模式
?向前搜索上一个模式
N向前搜索上一个模式
在手册页内移动
<Return>下移一行
<Down>下移一行
<Up>上移一行
g跳至页首
G跳至页尾
  

对任何程序而言,最重要的命令 都是显示帮助信息的那一个。 在这里,你只需按 h(字母 "h")。 一按下去,手册页的内容就会被 所有分页命令的摘要所取代。读完 帮助信息后,按 q 退出并返回 手册页。注意:这份摘要相当长, 就像手册页本身一样,你得按 <Space> 才能把信息 逐屏读完。不过,最重要的命令 都在摘要靠前的位置。

我接下来要讲的命令针对的是 less 分页程序,因为大多数 Unix 系统 都在用它。如果你的 man 命令使用的是 morepg,你只要按 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",跳到底部)。

跳至页首

两种实用的手册页技巧
(Two Useful Man Page Techniques)

我们到目前为止所讨论的阅读手册页的 方法,在概念上很简单:你用 man 命令显示某个特定主题的信息, 然后一屏接一屏地查看这些信息, 直到找到你想要的东西。

这是用标准 Unix CLI(命令行界面) 阅读手册页的常规方式。不过,如果把 man 命令与 Unix 工作环境 结合起来,你就能以更老练的方式 访问手册页。

正如我们在第 6 章讨论过的,你可以用 两种方式操作 CLI:终端窗口或虚拟控制台。 我的建议是,学会同时使用两个终端窗口, 一个用来干活,另一个用来显示手册页。 例如,假设你在一个终端窗口里工作, 用 vi 文本编辑器编辑一个文件 (见第 22 章)。你需要一些帮助, 于是决定查看 vi 的手册页。 如果你在一个第二个终端窗口里显示这一页, 就能同时看到手册页和原来的窗口。 Figure 9-2 展示了这种情形。

Figure 9-2: 在自己的终端窗口中显示手册页

把手册页显示在它自己的终端窗口中, 你就可以一边在另一个窗口里工作, 一边把它当参考。在这个例子中, 左边是 vim(vi 编辑器的一个 版本)的手册页。右边是一个正在运行 vim 的终端窗口。

要成为一名熟练的 Unix 用户,你需要 掌握同时使用多个窗口的技巧。 更准确地说,你必须能够回答这些问题: 什么时候该用单个窗口?什么时候该用 两个窗口?什么时候该用两个以上的窗口? 什么时候干脆忘掉窗口、改用 虚拟控制台?

这些问题的答案并不明显, 你会发现自己的技巧随着经验一起增长。 诀窍是绝不让自己陷入窠臼。例如, 不要永远只用一个窗口,也不要永远 用完全相同的方式使用两个窗口。

为了让你的百宝囊更丰富,我还想再教你 一个阅读手册页时可以使用的工具。

在阅读手册页时,如果你键入一个 !(感叹号),后面可以跟上 一条 Shell 命令。man 程序会把这条 命令交给 Shell,由 Shell 替你运行。 命令结束后,按 <Return> 即可返回 man 程序。

看看这是如何工作的:显示一个手册页, 然后键入:

!date<Return>

这里你是在 man 程序内部键入 date 命令。结果是你看到了时间和日期。 date 命令一结束,只需按 <Return>,你就回到了 man 程序中原来所在的位置。

可以想见,随时都能键入一条 Shell 命令 是非常有用的。特别方便的是,你可以用这个 技巧在阅读一个手册页的同时查看另一个 手册页,而不必切换到单独的窗口。 方法如下。

假设你正在阅读关于 man 命令的 手册页:

man man

读着读着,你发现有若干个相关的命令,其中 包括 whatis(本章后面会讨论)。 这时,你决定暂停手头的事,读一读关于 whatis 的内容。只需输入:

!man whatis<Return>

读完 whatis 之后,按 q 退出。 随后系统会请你按 <Return>,一按之下, 你就回到了原来的 man 程序, 继续读关于 man 命令的内容。

名称的由来(What's in a Name?)

Bang


作为 Unix 用户,你时不时会以一种 特殊的方式使用 !(感叹号)字符。 它通常会改变你当前操作的 mode(模式), 让你可以暂停当前程序,向 Shell 发送一条命令。(关于模式这一概念, 参见第 6 章。)

例如,在阅读手册页时,你可以键入以下 命令来显示时间和日期:

!date<Return>

! 字符以这种方式被使用时 — 作为一条命令而不是标点符号 — 它有一个专门的名称。我们称之为 BANG CHARACTER(bang 字符),或更简单地 称为 BANG。因此,一位 Unix 人士可能会说: "读手册页时想显示时间和日期,只要键入 'bang-d-a-t-e',然后按 <Return>。""

"bang"这个名字是一个俚语词, 在印刷和排版行业里已经使用了很久。 它的起源不详。

跳至页首

man 的替代选择:
xman 与 Web
(Alternatives to man: xman and the Web)

如我所讲,你可以用 man 命令显示在线 Unix 手册的页面。 除此之外,还有两种替代方式我想让你知道。

首先,大多数 Unix 系统的手册页 都以网页的形式存在于互联网上。 这意味着,无论你何时愿意,都可以用 浏览器找到并显示特定的页面。 在 Web 上阅读手册页的好处是,它们常常 带有链接,让你可以从一页跳到 另一页。常规手册页(使用 man 命令)是带一点突出显示的纯文本, 而不是带链接的超文本。

在 Web 上找到你想要的手册页,最简单的办法 是用 Google 这样的搜索引擎,搜索 "man" 加上命令名,例如:

"man whatis"

一定要把引号也写上。

另外,你也可以搜索 "man pages" 再加上 你所使用的 Unix 类型,找到更通用的 资源,例如:

"man pages" Linux
"man pages" FreeBSD
"man pages" Solaris

同样,别忘了引号。

— 提示 —

有空的时候,找一些为你所用的 Unix 或 Linux 类型提供手册网站的站点。选一个 你特别喜欢的,把它的 URL(网址)保存下来, 以便随时快速访问。

我的建议是把 URL 保存为浏览器 Links 栏上的一个按钮。 这样它就一直可见,方便使用。 不过,你也可以把 URL 保存为桌面上的 一个图标,或加入书签/收藏夹列表。 看看哪种方式最适合你。

使用基于 Web 的手册页之外的另一个选择是 xman,一个充当手册页浏览器的 基于图形用户界面的程序。(开头的 "x" 表示 该程序是为基于 X-Window 的图形用户界面 编写的;参见第 5 章。)如果你的系统上 有 xman,那么花一点时间动手试验、 学会使用它,是非常值得的。

要启动 xman,在命令行键入:

xman&

使用 &(and 符号)字符,是告诉 Shell 让这个程序自己在后台运行。

xman 启动后,会显示一个简单的窗口, 上面有三个大按钮,分别标着 Help、Quit 和 Manual Page(见Figure 9-3)。 让你自己读说明书,远比让我讲清这个程序的 全部复杂性容易得多,所以我只给两条提示。

Figure 9-3: xman 程序

xman 是一个基于图形用户界面的 手册页浏览器。右上方是初始窗口。 要开始使用,点击 "Help"。 左下方是搜索框,随时按 <Ctrl-S> 即可显示。

第一,要开始使用,只要点击 Help 框并 阅读说明。第二,只要焦点在任意一个 xman 窗口上,你都可以按 ^S (<Ctrl-S>)显示一个小搜索框。 这能让你轻松地找到想要的内容 (见Figure 9-3)。试一下,你就明白 我的意思了。

跳至页首

Unix 手册的组织方式
(How the Unix Manual Is Organized)

理解在线手册的最佳方式,是想象一本 巨大的参考书,住在你 Unix 系统的 某个地方。这本书就像一部百科全书: 它包含许多条目,按字母顺序排列, 每个条目涵盖一个主题。

你无法翻动这本书的书页;因此, 这里没有页码,也没有正式的目录或索引。 不过,对于一本电子书来说,它有 好几层组织方式。

传统上,整部手册被分为 八个节,编号从 1 到 8。 这些经典划分见Figure 9-4。在不同系统之间, 实际的名称可能有所不同,但大体上, 所有 Unix 手册都倾向于遵循相同的 总体组织。虽然你的系统上的手册 可能略有不同,但应该足够接近, 让你读下面的讨论时能够豁然开朗。

Figure 9-4: 在线 Unix 手册的八个节

1.  命令
2.  系统调用
3.  库函数
4.  特殊文件
5.  文件格式
6.  游戏
7.  杂项信息
8.  系统管理

手册最重要的部分是第 1 节。这一节包含了 绝大多数 Unix 命令的手册页。事实上, 除非你是程序员或系统管理员, 否则光靠手册的这一节你多半就够用了。

如果你是程序员,你还会对第 2 节和第 3 节 感兴趣。第 2 节包含系统调用的手册页, 程序用系统调用来请求内核执行 特定动作。第 3 节记录库函数, 有时称为子程序。这些是标准化的工具, 不直接涉及内核,在程序内部用来执行 特定任务。

第 4 节讨论特殊文件,这是一种 通常代表物理设备的文件。你在这里还能找到 关于设备驱动程序(充当设备接口的 程序)的信息。这一节主要供程序员使用。

第 5 节描述系统使用的重要文件格式, 包括配置文件。程序员和管理员都会 使用这一节。

第 6 节收录系统上安装的各类游戏的 手册页。旧时候,有大量基于文本的游戏和 娱乐程序,用户可以在命令行上使用。 一个例子就是我们在第 7 章讨论过的 Rogue 游戏。当年,第 6 节是手册的 重要组成部分。如今,大多数系统省掉了 基于文本的游戏,于是手册的这一节 往往空空如也。诚然,有许多基于 图形用户界面的游戏,但正如我在本章 开头所说,这类程序自带帮助功能, 所以不需要手册页。

这并不意味着不存在 Unix 的基于文本的 游戏。这样的游戏有很多,其中包括各种 精彩的消遣,你愿意的话就装到自己的 系统上。如果你用的是共享系统,而系统 管理员没有安装游戏(或者装了又删掉), 手册的第 6 节可能是空的。 这是因为大多数管理员不愿应对这样的用户抱怨: 读得到游戏的介绍,却玩不上游戏 (有点像摩西站在毗斯迦山顶, 眼巴巴地俯瞰应许之地)。

第 7 节是杂项信息节,里面是一个 大杂烩。第 7 节的内容因系统而异, 所以我没什么可多说的,只是和大多数 其他节一样,它主要引起的是程序员和 管理员的兴趣。

最后,第 8 节收录系统管理员用来 完成其工作的所有特殊命令的手册页。 换句话说,这些是只有超级用户 才能使用的命令。(关于系统管理 和超级用户的讨论,参见第 4 章。)

如果你使用的是共享系统,你多半不会关心 手册的第 8 节,因为系统管理由 别人在做。不过,如果你在自己的 电脑上运行 Unix,你就是管理员, 时不时会需要用到手册这一节里的 一些命令。

— 提示 —

除了第 1 节(命令)和第 6 节 (游戏),Unix 手册的大部分内容 只有程序员和系统管理员才感兴趣。

把 Unix 手册组织成这特定八节的做法, 源自最早的 Unix 实现,多年来 大体上保持未变。然而,现代手册 涵盖的内容比它们德高望重的祖先多得多。 因此,在你的系统上,你可能会看到 不同的、更全面划分的节,名称也可能不同。

你可能还会发现,某个节包含 专门的子节。例如,在某些 Linux 系统上, 如果你查看第 3 节(库函数)内部,会发现 好几个子节:第 3c 节是标准 C 函数; 第 3f 节是 Fortran 函数;第 3m 节是 数学函数;第 3s 节是标准 I/O 函数; 第 3x 节是特殊函数。

跳至页首

使用 man 命令时
指定节号
(Specifying the Section Number
When Using the man Command)

到目前为止,我们了解了如何通过键入 man 加上命令名来使用 Unix 手册。 例如,要了解 kill 命令(见第 26 章) — 它能阻止一个失控的程序 — 你可以输入:

man kill

这条命令显示的是手册第 1 节中 kill 的手册页。

然而,碰巧手册第 2 节(系统调用)中 也有一个 kill 条目。如果你真正想要 的是这个,你可以在命令名前面 指定节号:

man 2 kill

这是在告诉 Unix,你只对手册的 某一个特定节感兴趣。如果你所指的节 又分为若干子节,你可以尽可能 精确地指定。

如果你使用的是源自 System V 的 某类 Unix(参见第 2 章),命令的 形式略有不同:你得在节号前键入 -s。 例如 Solaris 就是这样:

man -s 2 kill

如果一节分为若干子节,你可以尽可能精确地指定。 例如,在某些系统上,第 3f 节—手册中记录 Fortran 子程序的那部分—也有一个 kill 条目。要显示这个手册页,请输入:

man 3f kill

如我早先所说,一次可以请求手册的 不止一个部分。例如,如果你想看到 kill 的全部三个条目,可以输入:

man 1 kill 2 kill 3f kill

当你不指定节号时,Unix 从手册的开头 (第 1 节)开始,一节一节向后找, 直到找到第一个匹配。因此,下面两条 命令的结果相同:

man kill
man 1 kill

— 提示 —

大多数时候,你感兴趣的是手册的第 1 节 (命令),所以不必指定节号。 只有当你在查找与编程(第 2、3、4、5、7 节) 或系统管理(第 4、7、8 节)相关的信息时, 才需要使用节号。

为了帮你熟悉手册的各个部分,每一节和 每一个子节都包含一个叫 intro 的页面, 充当简要的导读。熟悉某一节内容的 一个好办法,就是阅读它的 intro 页。

下面是几条显示这类页面的命令示例:

man intro
man 1 intro
man 1c intro
man 6 intro

如你所知,man 默认认为你想引用的是 第 1 节;因此,前两个例子是等价的。

— 提示 —

如果你是初学者,了解在线手册的最佳方式 是使用下面这两条命令:

man intro
man man

跳至页首

手册页的引用方式
(How Man Pages Are Referenced)

在阅读 Unix 资料时,你经常会看到一个 命令名后面跟着括号里的数字。 这个数字告诉你,要查找那个特定命令的 信息,应该翻到手册的哪一节。

例如,下面摘自 chmod 命令手册页 (BSD 伯克利版本)中一个句子的片段 (你将在学习第 25 章时认识 chmod)。 眼下不必在意这句话的意思,只看这个引用:

"...but the setting of the file creation mask, see umask(2), is taken into account..."

引用 "umask(2)" 告诉我们,umask 的手册页可以在手册的第 2 节找到。要读它, 你应当使用:

man 2 umask

由于我们知道第 2 节讲的是系统调用, 所以可以猜到,只有在编写程序时, 我们才会关心这个引用。

然而,在同一个 chmod 手册页的末尾, 还有下面两行:

SEE ALSO
ls(1), chmod(2), stat(2), umask(2), chown(8)

这里是与 chmod 相关的另外五个命令的 引用。如你所见,其中三个引用在第 2 节, 是给程序员看的。最后一个引用在第 8 节, 是给系统管理员看的。

不过,第一个引用指的是 ls, 它的手册页位于第 1 节。由于第 1 节讲的是 通用命令,这个引用很可能与你有关。 要显示这个手册页,我们可以用下面 两条命令中的任意一条:

man ls
man 1 ls

(顺带一提,ls 的用途是显示 文件名。我们将在第 24 章认识这个命令。)

— 提示 —

当你在查找信息或解决问题时,如果看到 指向手册第 1 节某个命令的引用, 你应当花时间顺着这个引用查一查。 即使这些信息并非你当下正好需要, 以后也会用得上。

而如果看到的是指向其他节的引用, 你可以忽略它们,除非那些信息 看起来特别有意思。

手册页的格式
(The Format of a Manual Page)

每个手册页只解释一个主题,最常见的是 一个命令、系统调用或库函数。 有些页很短,有些则相当长。例如, 描述各种 Shell 的那些手册页,长到 本身就足以充当一部参考手册。 想体会我的意思,试试下面某条命令:

man bash
man ksh
man csh

为了方便,每个手册页,无论长短, 都按照一种标准格式组织:整页被分为 若干部,每部都有自己的标题。 最常见的标题见Figure 9-5。有趣的是, 这些标题与多年前贝尔实验室开发 原版 Unix 手册时所用的如出一辙。 (当然,内容自那以后已发生了 天翻地覆的变化。)

Figure 9-5: 手册页中使用的标准标题。

标题 含义
Name命令的名称与用途
Synopsis命令的语法
Description完整描述(可能很长)
Environment命令使用的环境变量
Author程序员的姓名
Files与该命令关系密切的文件列表
See also到哪里查找相关信息
Diagnostics可能出现的错误与警告
Bugs失误、缺陷、警告

并非每个手册页都有以上全部标题, 有些手册页还有这个列表之外的 其他标题。我见过的其他标题包括 ExamplesReporting BugsCopyrightHistoryStandards。不过,无论实际设计 如何,手册页的基本格式始终如一。 事实上,我见过的每个手册页开头的 三个标题都相同:NameSynopsisDescription

为了帮助你理解,Figure 9-6 收录了一个 手册页示例。这个手册页实际出自一台 较老的 Unix 系统,你系统上对应的页面 很可能会长得多。我之所以选用这个例子, 是因为它短得足以排印出来,容易理解, 并且包含典型手册页的所有重要元素。

注意:在阅读Figure 9-6 的手册页时,请记住, "print"一词通常指在你的终端上 显示文本,而不是真的打印 (参见第 7 章)。

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...]
ls [-aAbcCdeEfFghHilLmnopqrRstux1@] [file...]

这时,实际的选项都已明列。 (你在Figure 9-6 中看到的手册页示例也是如此。) 与上面的例子一样,细节在 Description 部分中解释。 Synopsis 的职责只是提供 命令的快速概要。

Description:这一部分是篇幅最大的, 通常占据手册页的主体。它的目的是 解释你需要知道的大部分细节, 包括如何使用各个选项。在某些系统上, 完整说明被分为两个独立的部分: DescriptionOptions

阅读时,记住你看的是一部参考手册、 而不是教学指南,会有助于理解。 要做好心理准备:很多描述在你 没弄清自己在干什么之前都很难看懂。 这很正常。如果觉得吃力,就继续读, 读到你失去耐心为止:你读到的内容 总会留下一些印象。等学得更多时, 可以再回来试一次。

还要认识到,有些描述(比如各种 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 的部分会让付费客户 产生不好的联想。于是,你可能会看到 这一部分隐姓埋名,改叫 NotesLimitations 之类。别被骗了: bug 就是 bug,只要你用这个程序, 你就有权知道它们。

跳至页首

快速了解命令功能的简便方法:
(A Quick Way to Find Out
What a Command Does:) whatis

当你输入 man 命令时,Unix 会显示 整个手册页。然而有时你只想要 一个简单的描述。这种情况下, 你另有一条路可走。

如我上文所解释,手册页的 Name 部分包含一行描述。如果你只想看 这一行,请输入 man -f, 后跟一个或多个命令的名字。例如:

man -f time date

在这种形式的 man 命令中, -f 称为一个选项。(选项将在 第 10 章讨论。)字母 f 代表 "files"一词。每个手册页都存放在 单独的文件里;当你使用 -f 选项时, 你是在告诉 man 该查看哪些文件。

为了方便起见,你可以用 whatis 命令作为 man -f 的同义词。 例如,你想显示时间,但拿不准该用 time 还是 date, 输入这两条命令中的任意一条:

whatis time date
man -f time date

你会看到类似这样的输出:

date (1) - print or set the system date and time
time (1) - run programs & summarize system resource usage
time (3) - get date and time
time (7) - time a command

你可以忽略最后两行,因为它们指的 不是手册的第 1 节。看前两行, 你会发现你要的命令是 datetime 命令实际上是用来测量 一个程序或命令执行多快。

如你所知,输入 man 命令时, 你可以指定一个特定的节号 (如 man 1 date)。但用 man -fwhatis 时, 就不能这么精确了。Unix 总会 搜索整部手册。

因此,了解你的手册里有什么内容, 一个好办法是输入:

whatis intro

你会看到每个 intro 页的 简要概述。(试一下。)

注意:要让 whatis 命令正常工作, 手册页必须以某种方式预先处理。 这包括收集所有一行描述,并把它们 存放在特定的文件里。whatis 搜索的 正是这些文件,而不是手册本身 (那样就太慢了)。如果没有做预先处理, whatis 就返回不了有用的信息。 如果你的系统是这种情况,请去找 系统管理员谈谈。

跳至页首

搜索命令:
(Searching For a Command:) apropos

当你想了解某个特定命令时,可以用 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 (1)     - displays manual pages online
man (5)     - macros to format entries in reference manual
man (7)     - macros to typeset manual
route (8c)  - manually manipulate the routing tables
whereis (1) - locate source, binary, or manual for program

请注意,值得关注的命令有两条:manwhereis,因为只有它们位于第 1 节。 另外请注意,route 命令之所以被列出, 只是因为 "manual" 这几个字母恰好 出现在它的描述里。

你可能会问,为什么 aproposwhatis 没有出现在这个列表里? 毕竟这两条命令都帮助你访问在线手册。 要回答这个问题,请输入:

whatis apropos whatis

你会看到,"manual"一词并没有 出现在这些描述里:

apropos (1) - locate commands by keyword lookup
whatis (1)  - display command description

这里的教训是:apropos 命令 不是魔法 — 它能做的只是盲目地 搜索字符串 — 所以如果找不到 你想要的,就换一种问法再试试。

— 提示 —

大多数命令实际上是程序。例如, man 命令其实就是一个名叫 "man" 的 程序。不过,一些最基本的命令称为 内建命令(builtin commands),由 Shell 自己执行。这些命令的文档写在 Shell 的手册页里,在手册中不会有 单独的条目。

如果你在找一个你明知存在的命令, 却搜不到它自己的名字,就去查查 你的 Shell 的手册页:

man bash
man ksh
man csh

如果你使用 Bash,有一个特殊的手册页 会列出所有内建命令:

man builtin

名称的由来(What's in a Name?)

Apropos


在 Unix 中,apropos 命令是 man -k 的同义词。这个词 源自法语表达 à propos,意为 "与……相关"。在英语里,"apropos" 是介词,意思是"关于"或"提及"。例如, 你可能会在小说里读到这样一段:

"...安布尔挑起眉毛,探过身去,轻轻碰了碰 那位高大英俊的程序员的双唇。她甩动金色的 长发,只觉得一阵渴望的战栗掠过她精瘦柔美的 身体。'Apropos(关于)你的提议,'她眨着 睫毛,妩媚地呢喃道,'我真想当你那场 Unix 单身汉派对的司仪。不过,克里斯汀知道这封 邀请函的事吗?'..."

跳至页首

Foo、Bar 与 Foobar
(Foo, Bar and Foobar)

有两个妙不可言的词,你时不时会撞见: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 命令,以及在 sedawk 中的等价写法, 完成下面这些任务:把名为 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 系统
(The Info System)

Info 是一个在线帮助系统,独立于 Unix 手册之外,用来为 GNU 工具编写 文档(第 2 章有解释)。由于许多类型的 Unix — 包括几乎所有的 Linux 系统 — 都使用 GNU 工具,大多数人发现 同时了解在线手册和 Info 的用法很有用。 事实上,你会发现许多 Linux 手册页 都会把你引向 Info 以获取更多信息。

从表面上看,Info 和在线手册有几分相像。 信息存放在文件里,一个主题一个文件, 就像手册页一样。这些文件称为 Info 文件(INFO FILES),要阅读它们, 你使用 info 程序。只需键入 info,后跟一个命令的名字。

看下面两个例子。第一个显示 date 命令的手册页;第二个显示 同一命令的 Info 文件:

man date
info date

和在线手册一样,info 会一次 一屏地显示信息。和手册一样,你按 <Space> 翻到下一屏,按 q 退出。不过,正如你马上会看到的, 两者的相似之处仅此而已。

如果你启动 Info 有困难,可以通过查找 info 程序来确认你的系统上有没有 Info。下面任何一条命令都能办到 (参见第 7 章):

which info
type info
whence 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 都是好名字。

跳至页首

Info 与树
(Info and Trees)

你可能还记得,在第 8 章我们讨论过 数据结构的观念,这是计算机科学的一个 基本概念。数据结构是一种按照一组 精确规则来存储和检索数据的实体。 当时我提到,最常见的数据结构类型 有列表、链表、关联数组、哈希表、 栈、队列、双端队列(deque),以及 各种基于树的结构。

在第 8 章,我们讨论过栈,以便理解 dc 计算器如何处理逆波兰表示法。 在本节中,我们要讨论树,因为树正是 Info 用来存储和检索 Info 文件的 数据结构。一旦你理解了树,你用来 控制 Info 的命令就说得通了。如果你 不懂什么是树,你当然也能用 Info, 但既没乐趣,也不轻松。

当计算机科学家谈到树时,他指的是 一大类复杂的数据结构。所以,为了 简化生活,我们先从一个简单的比喻开始。

假设你决定去远足。你从登山步道 的起点出发,发现有好几条路可走。 你选了其中一条。你沿着它走, 直到来到一个岔路口,此时又有几条 新路供你选择。你再次做出选择, 继续前行,直到又来到一个岔路口, 不得不做出另一个选择。如此反复。 偶尔,你会走上一条通向死路的小径。 这时你就得回到之前的岔路口, 换一条路走。

用计算机科学的话说,我们把每个 岔路口称为节点(NODE)。主节点 (我们例子里的登山步道起点)称为 根(ROOT)。连接两个节点的路径称为 分支(BRANCH)。当一条分支通向 死路时,它是一种特殊的节点, 称为叶(LEAF)。

下面是技术定义:在计算机科学家眼中, 树(TREE)是节点、叶和分支的集合, 其组织方式保证任意两个节点之间 至多只有一条分支。(*)

* 脚注

计算机树背后的思想取自数学中称为 图论的一个分支。数学上的树与 计算机的树相似,但术语不同。

在图论中,节点称为 "vertex" (复数 "vertices"),分支称为 "edge"。 因此,如果你遇到一位图论学家,可以指望 他说出这样的话:"严格说来,Info 系统用的 数据结构并不是真正的树。由于有些 顶点被不止一条边连接,你其实应该把它 描述为一棵嵌入了树状对象的连通图。" (现在你明白为什么 Unix 人士请客 不叫图论学家参加派对了。)

虽然这一切听起来有点复杂,但它 类似于我们观察真正的树时所见的情形。 举个例子,看看Figure 9-7 中的示例树。 注意,与真正的树不同,计算机的树 通常把根画在上面。

Figure 9-7: 一棵树的示例

树是由若干节点通过分支连接而成的 数据结构。最上方(主)节点称为 树的根。末端节点(死胡同)称为叶。 在这个例子中,节点 1 是根; 节点 4、5、7、9、10、11 和 12 是叶。Info 系统使用的树中, 每个节点存放信息,每条分支都是从 一个节点到另一个节点的链接。

在计算机科学中,有各种各样不同类型的 树,各有自己的特点。我刚才描述的 那种树,正是 Info 用来存储信息的 数据结构。

每个 Info 文件被分成若干部,以一系列 节点的形式存储。阅读一个文件时, 你在节点之间移动。这让你能从头到尾 读完整个文件,一次读一个节点。当你 正在查看某个特定节点时,我们说你 正在访问(VISITING)该节点。许多节点 还包含链接(LINKS),让你可以跳到其他 相关的文件(就像网页上的链接一样)。

使用 Info 需要三项基本技巧。你需要了解 如何:

  1. info 命令启动 Info。
  2. 从一个节点移动到下一个节点, 以便通读整个文件。
  3. 用链接从一个文件跳到另一个文件。

下面我们逐一开始讨论这些技巧。

跳至页首

启动 Info:
(Starting Info:) info

要启动 Info 系统,你使用 info 命令。它有两种变体。 第一,如果你想显示某个特定命令的 信息,键入 info,后跟命令名。 例如:

info date
info bc
info info

如果你不确定想学哪个命令,或者想 在系统里随便浏览,那就单独输入 info 命令:

info

以这种方式启动 Info 时,它会显示一个 特殊的节点,称为目录节点 (DIRECTORY NODE)。目录节点包含一份 主要主题的列表,所以你可以把它看作 整个 Info 系统的主菜单。

跳至页首

了解 Info
(Learning About Info)

Info 有相当多的帮助信息可供你阅读, 帮你入门。在动手之前,请务必把本章 读到最后。

旅程的起点是 info 的手册页。 下面任何一条命令都能胜任:

info --help | less
man info

注意,第一条命令里有两个连字符, 而且 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 文件
(Reading an Info File)

在 Info 系统内,你可以使用许多命令。 我已把最重要的命令汇总在Figure 9-8 中, 并将在接下来的几节中逐一讲解。 阅读时,如果你启动 Info 跟着我们 的讨论实测这些命令,会大有帮助。 读完之后,你可以把Figure 9-8 当作参考。

Figure 9-8
Info:重要命令
通用命令
q退出
h启动帮助教程
?显示命令摘要
阅读节点
<PageDown>显示下一屏
<Space>显示下一屏
<Space>(在节点末尾)前往下一个节点
<PageUp>显示上一屏
<Backspace>显示上一屏
<Delete>显示上一屏
<Backspace>(在节点开头)返回上一个节点
<Delete>(在节点开头)返回上一个节点
在节点内移动
b跳到当前节点的开头
<Up>光标上移一行
<Down>光标下移一行
<Right>光标右移一位
<Left>光标左移一位
在同一文件内跨节点跳转
n跳到文件中的下一个节点
p跳到文件中的上一个节点
t跳到 Top 节点(文件的第一个节点)
跨文件跳转
<Tab>光标下移到下一个链接
M-<Tab>光标上移到上一个链接
<Return>跟随链接进入新节点或新文件
l跳回上一个(刚看过的)节点
d跳到 Directory 节点(主菜单)
  

每个 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 容易得多。

Figure 9-9: Info 树

这里是一幅高度简化的示意图,展示 Info 文件如何作为树中的节点存储。 树的根部是目录节点(Directory Node)。 在我们的例子中,目录节点有指向 四个 Info 文件的链接,我把它们 命名为 A、B、C 和 D。每个文件 以节点序列的形式存储,序列中的 第一个节点称为 Top 节点。注意, 文件 C 含有指向文件 B 和文件 D 的 Top 节点的链接。

— 提示 —

阅读 Info 文件最简单的办法,是从它的 Top 节点开始,反复按 <Space>。 这样,你就会一次一个节点地把整个 文件读完。

跳至页首

在节点之间跳转
(Jumping From One Node to Another)

在阅读 Info 文件时,有好几条命令可以用来 从一个节点跳到另一个节点,既可以在同一 文件内,也可以跳到完全不同的文件。

要跳到当前文件中的下一个节点,按 n; 要跳到上一个节点,按 p。要跳到 当前文件的 Top 节点(开头),按 t

许多节点,尤其是 Top 节点,包含一份以 菜单形式呈现的主题列表。每个主题实际上 都是一个链接,你可以跟着它走。有些链接 跳到文件内的另一个节点;另一些链接则 跳到完全不同的文件。

你很容易认出链接,因为它们有特定的格式: 一个星号(*),接着是主题名, 再跟一个冒号(:)。冒号之后, 你会看到这个主题的一段简短描述。 有时还会附有一条说明性的注释。

下面是从我上文讲过的 Info 教程中摘取的 两个例子。这些例子正是为了展示典型 菜单项的样子(*):

* Foo: Help-FOO. A node you can visit for fun.
* Bar: Help-BAR. A second way to get to the same place.

* 脚注

这些例子直接取自 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>:显示下一屏
2.  <Backspace>:显示上一屏
3.  <Tab>:光标下移到下一个链接
4.  <Return>:跟随链接
5.  d:跳到目录节点(Directory Node)
6.  l:跳回上一个访问过的节点
7.  q:退出

只要记住这七条命令,并承诺在需要时 继续学习更多,你就能把 Info 用得很好。

跳至页首



练习
(Exercises)

复习问题 #1:

Unix 的两大文档系统是什么?

你分别用什么命令访问它们?

复习问题 #2:

在阅读手册页时,如何输入一条单独的 Shell 命令?

复习问题 #3:

在查看 Info 节点时,你分别用什么命令来:

• 显示帮助教程
• 显示命令摘要
• 显示下一屏
• 跳到当前节点的开头
• 跳到下一个节点
• 跳到 Top 节点
• 跳到目录节点(Directory Node)

知识运用 #1:

man 命令显示你的默认 Shell 的 手册页(man sh)。页面显示出来后, 完成以下操作:

• 显示下一屏信息
• 跳到页尾
• 跳到页首
• 搜索单词 "variable"
• 向后连续搜索该词的若干次出现
• 向前连续搜索该词
• 显示命令摘要
• 退出

知识运用 #2:

如果你使用的是 Linux 或 FreeBSD,用 info 命令显示关于 Info 系统本身的信息 (info info)。

第一个节点显示出来后,完成以下操作:

• 显示下一屏信息
• 跳到当前节点的末尾
• 跳到当前节点的开头
• 跳到 Top 节点
• 跳到目录节点(Directory Node)
• 显示命令摘要
• 退出

进一步思考 #1:

RTFM 的准则要求人们在求助之前,先通过 阅读文档试着自己帮助自己。这条准则有 哪两大优势?又有哪两大劣势?

跳至页首