Unix 之书
☰ 目录

第 10 章...

命令语法(Command Syntax)

在使用 Unix 的 CLI(命令行界面,command line interface)时,你会一条接一条地输入命令。你键入的 整行内容称为命令行(COMMAND LINE)。当你在行尾 按下 <Return> 键时,命令行中的内容就 会被送交 Shell 处理。

输入命令时,有两件事需要理解。第一,你必须 按照一定的规则正确地键入命令,如何做到这一点 正是本章的主题。第二,你必须理解 Shell 处理命令时会发生什么。这是一个重要的话题, 本书后面讲到 Shell 时我们再讨论。

Unix 命令实打实地有数百条之多,而且只要 你还在使用 Unix,就永远有学不完的新命令。 因此,你需要具备自学的能力:有需要时,就从 在线手册中寻找答案。要想用好手册, 你需要理解那些规定命令必须如何输入的形式化 规则。

一次输入
多条命令(Entering More Than One Command at a Time)

大多数情况下,你在命令行上只键入一条 命令。不过你应当知道,一次输入多条命令 也是可以的。你要做的,只是用分号把各条命令 分隔开。

举个例子。你正在和朋友通电话,筹划一场 聚会。你想显示今天的日期,同时显示本月的 日历。完成这两件事的命令是 datecal(见第 8 章)。当然,你可以 分别输入这两条命令:

date
cal

不过,把分号当作命令分隔符,你就能 在一行之内全部完成:

date; cal

注意,命令行末尾不需要加分号。

再看一个例子:用 cp 命令复制 文件(见第 25 章),用 ls 命令 列出文件信息(第 24 章),用 rm 命令擦除(删除)文件(同样见第 25 章)。

你的目标是把名为 data 的文件复制 两份,副本分别叫 backup1backup2。复制完成之后,你想擦除原 文件,然后列出所有文件,看看自己手上都有 些什么。命令看起来是这样的:

cp data backup1
cp data backup2
rm data
ls

不必在意细节。本书后面会讲到这些命令。 这里的重点是:我们不必把四条命令分四行 键入,而是可以用分号分隔,把它们写在 同一行之内:

cp data backup1; cp data backup2; rm data; ls

你也许会问,把所有命令都写在同一行之内 有什么意义?毕竟两种写法要键入的字符数是一 样的。

答案是:从长远来看,学会一次往前多想 几步,你就能把 Unix 用得更得心应手,就像 棋手决定下一步时要预判之后的几步一样。 眼下这也许算不上什么大事,但随着你经验的 增长,它会变得十分重要。

在第 15 章到第 19 章中,我会向 你展示如何把命令和工具组合起来,形成复杂的 命令行。要把这件事做好,你需要培养自己作为 Unix 问题求解者的技巧。眼下,我希望你开始 这样思考:看看能找到多少机会,在同一命令行 上输入多条命令。

— 提示 —

好的 Unix 用户与出色的 Unix 用户之间的 差别,在于能否随着问题的出现,把工具与 思路快速、有创意地组合起来加以解决,而且 毫不拖泥带水。事实上,有人会说,这正是 用好 Unix 的精髓。

输入命令时
会发生什么?(What Happens When You Enter a Command?)

输入一条命令时,你键入命令的名字,后面 也许还有其他信息。例如,看看下面这条 ls 命令行。

ls -l -F file1

这条命令由四部分组成:命令名 ls,后面是 -l-Ffile1。(稍后我会更具体地说明这些 部分的名称。)

按下 <Return> 键后,Shell 就会处理 你的命令。实际的细节有些复杂,我们把讨论 留到后面的章节。眼下,这里给出一个简化的 描述,它在大多数时候对大多数人都是够用的。

Shell 处理命令行时的假定是:这一行的 第一部分是你要运行的命令名。接着,Shell 会查找该名字对应的程序并执行它。例如,如果 你输入前面那条 ls 命令,Shell 就会 找到 ls 程序并运行它。

如果你输入的命令名是 Shell 找不到的, 它会显示一条错误信息。例如,假设你输入:

harley

虽然难以置信,但 Unix 确实没有 harley 这条命令,所以你会看到:

harley: not found

当 Shell 确实找到了你要的程序时,它就 运行这个程序。这时,Shell 会把整条命令行的 一个副本发送给该程序。如何处置这些信息, 则要由程序自己判断。在上面那个例子中,就 该由 ls 程序来判断该怎样对待 -l-Ffile1

命令语法(Command Syntax)

Unix 命令必须严格按照定义清楚的规则来 键入。一个标点放错了位置,或者一个单词拼错 了,都可能让整条命令失效。大多数时候,你会 看到一条错误信息,命令则被忽略。然而最糟糕 的情况是,键入有误的命令被错误地执行并造成 问题。因此,学会正确输入命令至关重要。 对"命令应当如何输入"的形式化描述,称为这条 命令的命令语法(COMMAND SYNTAX),或者更 随意地称为语法(SYNTAX)。

怎么学一条命令的语法?很容易。一旦你 理解了通用的规则和惯例,就能靠自己在手册或 Info 系统中查出它的语法,从而学会使用任何 命令(见第 9 章)。

如果你是初学者,你明白有许多命令以你 目前的能力还驾驭不了。事实上,有些命令你 可能永远看不懂(也永远不需要看懂)。尽管 如此,我的目标是:读完本章时,你应当能看懂 你碰到的任何命令的语法,即使你还不 理解那条命令本身(*)。

* 脚注

这听上去也许古怪,其实不然。例如学一门 外语时,用不了多久,你就能读出那些自己并不 理解的句子。Unix 也是如此。读完本章时,你 将能看懂任何 Unix 命令的语法。不过,在你 积累更多经验之前,大多数命令对你仍然是个谜。

我的目标是确保你牢牢掌握基本原理, 例如命令语法。这样你就能靠经常练习、花时间 自学来填补空白。比如,每当有问题时,我都 鼓励你花一点时间,用手册或网络为自己找出 答案。(如果这听上去挺有意思,那你可真是 个幸运的人。)

一般而言,Unix 命令语法可以这样表述: 先键入命令的名字,然后是若干"选项",再然后 是若干"参数":

command-name options arguments

选项让你能够控制命令该怎样完成工作, 而参数则指定你希望命令使用的数据。

看这个例子:

ls -l -F file1 file2 file3

命令名是 ls。选项是 -l-F。参数是 file1file2file3

现在,我们接着谈细节。

选项(Options)

键入一条命令时,你用选项(OPTIONS)来 改变命令完成工作的方式。阅读 Unix 文档时, 你有时会发现选项被称为 SWITCHES(开关) 或 FLAGS(标志),所以这些词你也要认识。

正如其名,选项用不用是自便的。大多数 命令至少有几个选项,但有些命令的选项多到 让你怀疑究竟谁能全都记住。答案是没人能。 即使是老手,也要靠手册去查那些冷僻的选项。

在命令行中,选项紧跟在命令名之后。 一个选项要么是一个连字符(hyphen)后跟一个 字母,要么是两个连字符后跟一个单词。例如:

ls -l -F file1 file2 file3
ls --help

第一条命令有两个选项:-l-F。第二条命令有一个选项: --help

选项的作用,是让你能够控制命令的行为。 例如在我们的例子里,-l 选项告诉 ls 命令显示"长"(long)格式的列表。 通常,ls 命令只列出文件的名字。 当你使用 -l 选项时,ls 除了 列出名字,还会列出每个文件的额外信息。

有时你会见到某个选项是一个数字,例如:

ls -1 file1 file2 file3

这时你得小心。比如在这个例子中,不要把 -l(小写字母 "L")与 -1(数字 1)搞混。

当你使用多个单字符选项时,你只需一个 连字符就能把它们组合起来。而且,选项的 先后顺序随意。因此,下面这些命令都是等价的:

ls -l -F file1
ls -F -l file1
ls -lF file1
ls -Fl file1

和所有 Unix 命令一样,你必须确保 大小写用得准确无误。例如 ls 命令 既有 -F 选项也有 -f 选项,而 两者是不同的。不过一般而言,大多数选项都是 小写的。(正如我在第 4 章中所解释的, Unix 中几乎所有东西都是小写的。)

— 提示 —

在手册中查找一条命令时,你会看到每个 选项各自的说明。然而 man 手册页不会告诉你 单字符选项可以组合起来。例如 -l -F 可以组合成 -lF。这是 Unix 的基本常识,手册默认你已经懂了。

到这里,一个有趣的问题出现了:说到一个 选项时,那个连字符该怎么念?

早年间,人们把它念作 "minus"(负号), 大概因为它比 "hyphen" 更容易开口。例如, 年长一些的人会把 ls -l 念成 "L-S-minus-L"。

然而在 Linux 文化中,人们普遍把这个 连字符称作 "dash"(短横线),年轻用户尤其 如此。因此,Linux 用户多半会把 ls -l 念成 "L-S-dash-L"。 同样,"ls --help" 会被念成 "L-S-dash-dash-HELP"。

键入命令时,"minus" 和 "dash" 的区别 并不重要。然而在口头交流时,你怎么说出口 却可能有着重要的社交含义。

例如,假设上课时老师点了你的名,问你: "你怎么让 ls 命令显示长格式的文件 列表?"大多数学生的回答会是:"用 dash-L 选项。"不过,如果你觉得你的老师是在 20 世纪 90 年代中期之前学的 Unix,那就该敬重 前辈,说:"用 minus-L 选项。"(记住, 你自己总有一天也会变老。)

单横线选项与双横线选项(Dash Options and Dash-Dash Options)

就选项而言,单横线的格式是更古老的 那种。它可以追溯到最早的 Unix 系统(见 第 2 章),那时程序员希望在命令行上 力求简省。许多命令名只有两三个字母,所有 选项也都只有一个字母。

多年之后,开发 GNU 工具集时(见 第 2 章),设计者们希望能使用更长的 选项。然而,长期形成的惯例规定所有选项都 只能是一个字母,而且可以像上面所说的那样 组合起来。例如,你认为 Shell 遇到下面这条 命令时会发生什么?

ls -help

由于多个选项可以组合,-help 会被 理解为四个各自独立的选项:-h-e-l-p

当然,修改规则也不是不行,但那是一项 剧烈的改变,会使许多现有程序失效,并迫使 太多人改变自己的习惯。于是人们决定,允许 使用更长的选项,只要它们前面用两个连字符 而不是一个。这样,系统就能得到扩展,而又 不损害已有的东西。

由于 Linux 使用 GNU 工具集,如果你是 Linux 用户,两种选项你都会见到。在大多数 其他系统上,你只会见到单字符选项。

我们不妨称之为双横线(dash-dash)选项的 东西,其主要用途是使用更长的选项名,从而 更容易理解和记忆。但另一方面,较长的选项 键入起来更慢,而且更容易拼错。因此,许多 命令通过为同一个选项同时提供短名和长名来 让你自选。这样你想用哪个就可以用哪个。

例如,ls 命令(用于列出文件信息) 有一个 -r 选项,它使该命令按相反的 顺序列出文件。在 Linux 上,该命令还有一 个 --reverse 选项,作用完全相同。 因此,下面两条命令是等价的:

ls -r
ls --reverse

在双横线选项的世界里,使用 GNU 工具集 时你会经常碰到两个选项。如果你是 Linux 用户,这两个选项值得牢牢记住。

第一,许多命令在你使用 --help 时会显示该命令语法的摘要。通常你会单独 使用这个选项。例如:

ls --help
date --help
cp --help

很多情况下,摘要长到你还没来得及读, 其中大部分就已经滚出屏幕。如果遇到这种 情况,就把输出送给 less 程序,它会 一次一屏地显示这些信息。要做到这一点, 键入一个 |(竖线)后面跟上 less。例如:

ls --help | less
date --help | less
cp --help | less

(关于 less 的讨论见 第 21 章。)

第二个常见的双横线选项是 --version:

ls --version
date --version
cp --version

这个选项显示的信息是:你的系统上安装的 这个特定程序是哪个版本。通常你并不需要 这类信息。不过,如果你碰上了麻烦,知道 自己运行的是哪个版本的程序有时会有帮助。

— 提示 —

几乎所有 Unix 命令的选项键入规则都是 相同的:每个选项以一个或两个连字符开头; 单字符选项可以组合使用。不过,也有少数 例外。

有些命令使用的选项不带连字符。有些 命令可以接受连字符,但并不要求有。最后, 有些命令不允许你组合单字符选项。

所幸例外很少。不过,如果你对某条命令 有什么疑问,请去查 man 手册页。它才是权威 的依据。

参数(Arguments)

我前面提到过,Unix 命令的一般语法可以 这样表述:命令的名字,后面是若干选项, 再后面是若干参数:

command-name options arguments

命令名和选项我们都已经谈过,所以让我 接着讨论参数的用法。

在命令行上,参数(ARGUMENTS)用来把 信息传递给你想运行的程序。看看这个例子, 它在前面讨论选项时我们已经见过:

ls -l -F file1 file2 file3

命令是 ls,选项是 -l-F,参数是 file1file2file3

参数的含义会因命令而异。典型的用法是, 参数指定程序要在其上执行动作的数据。在 我们的例子里,我们指定的是三个文件的名字。

再看另一个例子:

man date

命令名是 man,没有选项,参数是 date。在这条命令中,我们是在告诉 man 显示 date 的 man 手册页。

最后一个例子:

passwd weedly

这里我们使用 passwd(修改密码) 命令,带一个参数 weedly。这种情况下, 我们是在表明想为用户 ID weedly 修改 密码(见第 4 章)。

名称的由来

Argument(参数)


Unix 命令的一般语法是:

command-name options arguments

"option"(选项)这个词之所以讲得通, 是因为命令行选项让你在"命令该如何执行" 这件事上有所选择。然而,"argument"这个词 又作何解释?显然,它指的不是智力上的交锋, 也不是"一串旨在确立某个命题的陈述"(*)。

实际上,计算机术语 "argument" 借自 数学,在数学中表示自变量。例如,在等式 f(x) = 5x + 17 中,argument 就是 x。从这个意义上说,参数就是命令或 函数所要操作的对象。

在英语中,"argument" 一词源自拉丁语 arguere,意思是澄清或阐明。

* 脚注

如果你没认出这段话出自 Monty Python 的 小品 "The Argument Clinic"(辩论诊所), 那你的文化修养就有不小的欠缺了。我的建议 是:现在就花点时间补上这一课。提示:用网络 搜索:

"monty python" "argument clinic"

空白符(Whitespace)

输入命令时,你必须确保把每个选项和 参数分隔开。为此,你要在各部分之间键入至少 一个空格或制表符(tab)。例如,下面是输入 同一条命令的几种方式。注意,我明确标出了 按下 <Space> 键和 <Tab> 键的 位置:

ls<Space>-l<Space>-F<Space>file1
ls<Tab>-l<Tab>-F<Tab>file1
ls<Space><Tab>-l<Space>-F<Tab><Tab><Tab>file1

当然,通常你只会在命令各部分之间放 一个空格。事实上,在某些 Shell 中你只能 使用空格,因为制表符另有特殊功能(称为 命令补全)。然而,把空格和制表符用作分隔符 这一观念重要到值得拥有自己的名字:空白符。

这个概念在你使用 Unix 的过程中会反复 出现,所以让我给你一个形式化的定义。在 命令行内,空白符(WHITESPACE)指一个或多个 连续的空格,或者(在某些 Shell 中)制表符。 在其他场合,空白符可能指一个或多个连续的 空格、制表符或换行符。(关于换行符的讨论见 第 4 章。)

如果你是 Windows 或 Macintosh 用户, 你必定见过包含空格的文件名。例如,Windows 系统使用名字类似 "Program Files"、 "My Documents" 等的文件夹(目录)。而在 Unix 中,命令行里的空格被视作空白符。因此, 你绝不应该在文件名中使用空格。同样,你也 永远不会看到名字里带空格的 Unix 命令。

— 提示 —

当你为一个包含多个部分的东西取名时, 绝不应该在名字中间使用空格。不过,你可以 使用连字符(-)或下划线(_)。

例如,下面这些都是有效的名字:

program-files
program_files
my-documents
my_documents

我个人偏爱使用连字符,因为它们的 可读性比下划线更好。

(提醒:Unix 区分大小写。而且大多数 时候,我们取名只用小写。)

名称的由来

Whitespace(空白符)


"whitespace"(空白符)这个词指的是 用于分隔两项内容的连续空格和制表符。这个 名字来自最早期打印在纸上的 Unix 终端。 当你键入一条命令时,每个词之间确实有真正 的空白。

Unix Shell(命令处理器)在设计上很有 弹性;只要各部分被分隔开,它并不在意命令行 各部分之间有多少空格。于是,"whitespace" 这个词就演变成指任意数量的空格和制表符。

后来,在某些应用中,这个词的含义被 扩展为任意数量的空格、制表符或换行符。 (你会记得第 4 章讲过,换行符就是按下 <Return> 键时产生的那个字符。)

一个或多个;零个或多个(One or More; Zero or More)

下一节我将讨论描述命令的形式化方法。 但在那之前,我需要先定义两个重要短语: "one or more"(一个或多个)和"zero or more" (零个或多个)。

当你看到"一个或多个"(ONE OR MORE)这个 说法时,它的意思是你必须至少用上某一个东西。 举个例子。

在第 9 章中我解释过,你可以用 whatis 命令显示一条命令的简短说明, 其内容来自该命令在在线手册中的条目。使用 whatis 时,你必须指定一个或多个命令名 作为参数。例如:

whatis man cp
whatis man cp rm mv

第一个例子有两个参数;第二个例子有 四个参数。由于这条命令的规定是"一个或多个" 名字,我们必须至少包含一个 — 它不是 可选的。

而"零个或多个"(ZERO OR MORE)这个说法 的意思是,你可以用一个或多个,但完全不用 也可以。

例如,我前面说过,ls 命令配合 -l 选项会列出你所指定的文件的信息。 这条命令的确切格式要求你指定零个或多个文件 名。这里是三个例子:

ls -l
ls -l file1
ls -l file1 file2 data1 data2

每当看到要求"零个或多个"的规定,你 都该问一句:"如果我一个都不给,会怎么样?" 通常会有一个默认值(DEFAULT)——一个假定 的值 ——被拿来使用。

ls 而言,默认值是你"工作目录" (第 24 章有解释)中的全部文件。因此, 如果你不指定任何文件名 — 如第一个例子 那样 — ls 会列出工作目录中所有 文件的信息。当你指定一个或多个文件名时, ls 只显示那些特定文件的信息。

— 提示 —

每当别人告诉你某样东西可以用零个或多个 时,你都要问:"默认值是什么?"

命令的形式化
描述:语法(The Formal Description of a Command: Syntax)

学习一条新命令,一个好的方法是回答 下面三个问题:

• 这条命令是做什么的?
• 选项该怎么用?
• 参数该怎么用?

要了解一条命令的作用,用 man 命令在在线手册中查出它(见第 9 章), 然后阅读摘要。如果你需要更多信息,就再 看看完整的说明。

查看 man 手册页时,你会看到命令语法: 也就是使用该命令的确切形式化规定。通俗地 说,你可以把语法当作"官方的"命令用法说明。

在 Unix 中,命令语法遵循七条规则。 前五条最为基础,所以先从它们讲起。另外 两条规则我们一会儿再说。

  1. 方括号中的内容是可选的。
  1. 不在方括号中的内容是必须有的。
  1. 黑体印刷的任何内容,必须照原样 键入。
  1. 斜体的任何内容,必须替换为适当的值。
  1. 某个参数后面跟着省略号(...)时,它可以重复任意次数。

下面举个例子说明这一切如何运作。以下 是某个特定 Unix 系统上 ls 命令的 语法:

ls [-aAcCdfFgilLqrRstu1] [filename...]

从语法上看,我们能说出这条命令的 什么?

• 这条命令有 18 个不同的选项。 你可以使用 -a-A-c-C 等等。由于这些选项是可选的,它们 被写在方括号里。换句话说,你可以使用零个 或多个选项。

• 有一个参数 filename。这个 参数也是可选的,因为它同样写在方括号里。

• 命令名和选项用黑体印刷。这意味着 必须照原样键入它们。

• 参数是斜体。这意味着你必须用适当 的值来替换它(在这种情况下,是一个文件或 一个目录的名字)。

• 参数后面跟着 "...",这意味着你 可以使用不止一个参数(以指定多个文件的 名字)。由于参数本身是可选的,更精确的说法 是:你必须指定零个或多个文件名。

根据这条语法,下面是一些有效的 ls 命令。记住,单横线选项可以分开 键入,也可以用一条连字符组合在一起:

ls -l
ls file1
ls file1 file2 file3 file4 file5
ls -Fl file1 file2
ls -F -l file1 file2

下面是一些无效的 ls 命令。第一条 命令无效,因为它使用了一个不存在的选项 (-z):

ls -lz file1 file2

下一条命令无效,因为选项出现在参数 之后:

ls file1 -l file2

这个例子有点狡猾,它说明了为什么你 必须严格遵循语法。

一般而言,选项必须出现在参数之前 (虽然也可能有例外,我马上就会提到)。由于 file1 这个词不以连字符开头,ls 就认为它是参数,其后跟着的一切也都被当作 参数。于是 ls 以为你在指定三个文件的 名字:file1-lfile2。 当然,并没有名为 -l 的文件,所以这条 命令的结果不会是你想要的。

最后两条语法规则涉及更复杂的情形。

  1. 如果你看到某个单独的选项与一个参数 组合在一起,那么这个选项和这个参数必须 一起使用。

下面的例子(Linux 上 man 命令的 一个简化版本)说明了这条规则:

man [-P pager] [-S sectionlist] name...

在这种情况下,如果你想用 -P 选项, 它后面必须紧跟参数 pager。同样,如果 你想用 -S 选项,它后面必须紧跟参数 sectionlist

你可以看到,这种语法是"所有选项都在 参数之前"这一通用准则的一个例外。在这种 情况下,pager 参数可能出现在 -S 选项之前。

最后,还有一条语法规则。

  1. 两个或多个由 | (竖线)字符分隔的项目, 表示你要从中挑选一个。

下一个例子说明了这一点,它给出 Linux 版 who 命令的语法:

who [-abdHilmpqrstTu] [file | arg1 arg2]

这里,语法告诉我们:要么用一个名为 file 的参数,要么用两个名为 arg1arg2 的参数。

下面是两个例子。第一个指定 file; 第二个指定 arg1arg2:

who /var/run/utmp
who am i

不必在意细节(*)。我要你注意的是:当你 有多个选择时,竖线是如何用来指明可选方案的。

* 脚注

如果你阅读 who 的 man 手册页, 就会看到第一个参数(file)是 who 从中获取信息的那个文件的位置。 你可以指定自己的文件来代替默认文件。这不是 你平时会做的事,但这个想法简单明了。

另外两个参数(arg1 arg2)就更有趣了。你也许还记得第 8 章 说过,输入下面这条命令就能显示当前登录的 用户 ID 的名字:

who am i

有意思的是,只要你给出两个参数, who 命令无论你怎么写都会这样回应。 例如,你可以键入:

who are you
who goes there

或者,如果你够大胆:

who is god

你认为这条命令为什么被编写成这样?

从 Unix 手册中
学习命令语法(Learning Command Syntax From the Unix Manual)

阅读印刷材料(比如本书)时,哪些词是 黑体、哪些词是斜体一目了然。然而,当你在 显示器上查看在线手册时,你可能看不到这些 特殊的字体。

在某些系统上你会看到黑体和斜体,另一些 系统则看不到。在不显示斜体的系统上,你往往 会看到下划线作为替代。无论如何,你都得习惯 你所用的那个具体系统,从而能从上下文中 推断出究竟哪些词是参数。多数时候这并不难。

典型的 man 手册页会解释每一个可能的 选项和参数。不过在语法摘要中,某些版本的 手册使用一种简化形式,其中并不逐个列出 选项,而是用 "options" 这个词来代表它们。 举个例子。前面我给出过某个版本的 ls 命令的语法:

ls [-aAcCdfFgilLqrRstu1] [filename...]

采用简化形式时,语法会是这样的:

ls [options] [filename...]

不必担心。不论你在语法摘要中是否看得 到那些选项,在详细的命令说明里,它们都会 被一一列出 — 并加以解释。

这么多选项怎么学得完?(How Can You Learn So Many Options?)

你已经注意到,在我们一直使用的例子中, ls 命令有 18 个不同的选项。实际上, 某些版本的 ls 命令选项更多,其中 许多就是所谓的双横线选项。于是一个问题 产生了:这么多选项怎么学得完?

答案是:学不完。没有人能记住每条命令 的所有选项,即使是自己经常使用的命令也一样。 最好的办法是只记住最重要的那些选项。需要 使用其他选项时去查就是了 — 在线手册就是 为此而存在的。

Unix 程序员的一个特点是,他们倾向于 编写带有很多选项的程序,而其中大多数你尽管 忽略不用也没关系。此外,不同版本的 Unix 为 同一条命令提供不同的选项,这种情况也十分 常见。

我们一直在用的 ls 命令来自某种 特定的 Unix。其他系统上的 ls 命令 选项数目会不一样。不过,最重要的那些选项 — 你大多数时候会用的那些 — 在不同 系统之间很少有多大差别。

本书会讲解许多 Unix 命令。讲解时我会 有意只描述最重要的选项和参数,也就是你 大多数时候需要的那些。如果你在学习某条 命令,又好奇它所有可能的选项和参数,你 只要花点时间查一查本机的手册即可。

再看看我在第 9 章中描述过的 man 命令的语法:

man [section] name...
man -f name...
man -k keyword...

由于这条命令有三种不同的用法,用三个 不同的描述来展示它的语法是最方便的。

man 的第一种用法是带一个可选的 section(手册节号)以及一个或多个 name 值。第二种用法是使用 -f 选项和一个或多个 name 值。第三种用法 是使用 -k 选项和一个或多个 keyword 值。

man 使用的选项并不止这些,这里说的 只是最重要的。在某些系统上,man 有 大量选项。不过就日常工作而言,-f-k 是你唯一需要的。如果你想进一步了解 你的系统上还有哪些可用选项,去查手册就是了。

作为本章的结尾,这里还有最后一个例子。 正如我在第 9 章中解释的,你可以用 whatis 命令代替 man -f,用 apropos 命令代替 man -k。这两条 命令的语法是:

whatis name...
apropos keyword...

语法告诉我们,要使用这两条命令中的 任何一条,你键入命令名(whatisapropos),后面跟一个或多个参数。

— 提示 —

有些命令在不同版本的 Unix 之间有细微 差别。本书中,我一般使用命令的 GNU/Linux 版本。大多数时候这没有问题,因为最重要的 选项和参数在大多数类型的 Unix 中往往是一 样的。

不过,如果你遇到问题,那么关于某个程序 在你的系统上如何运行,权威的信息来源 是你自己的在线手册,而不是本书(也不是任何 一本书)。

练习(Exercises)

复习问题 #1:

你怎么在同一行之中输入多条命令?

复习问题 #2:

Unix 命令的语法可以表示成这种形式:

command-name options arguments

什么是选项?什么是参数?

复习问题 #3:

什么是单横线选项和双横线选项?

每种类型各有什么用途?

复习问题 #4:

什么是空白符?

复习问题 #5:

当你学习一个新程序的语法时,你应该问的 三个基本问题是什么?

应用你的知识 #1:

在同一行中输入多条命令往往很有用。请 把下面三条命令键入一行之内,做出一个关于 你系统运行状况的简短摘要:

date(时间与日期)
users(已登录的用户 ID)
uptime(你的系统已运行了多久)

应用你的知识 #2:

写出下面这个程序的语法。命令名是 foobar。有三个选项 -a-b-c-c 选项带一个名为 value 的可选参数。最后,必须有一个或 多个名为 file 的参数。

进一步思考 #1:

许多 GNU 工具(用于 Linux 和 FreeBSD) 既支持传统的、简写的 -(dash,单横线) 选项,也支持较长的 --(dash-dash, 双横线)选项。为什么 GNU 的开发者认为有必要 引入一种新的选项风格?

这样做的优点是什么?缺点是什么?