对话 UNIX: 掌握强大的命令行

对话 Unix:您好,shell!
UNIX?系统中一项最奇特和突出的特性就是其命令行功能 。您只需输入包含一定逻辑关系的少量文本,即可使用命令行来将有限的 UNIX 实用工具组合成无限的即时可用的数据转换 。
例如,要在当前工作目录下的文件夹层次结构中查找独特文件名的列表,您可在 shell 提示符下输入以下命令:
find . -type f -print | sort | uniq
该命令行中组合了三种不同的实用工具:
find 对指定目录进行深度搜索,在本例中,是对从 . 或 点(代表当前工作目录)开始的文件系统进行搜索并生成满足给定条件的所有项的名称 。这里,-type f 告诉 find 只查找文本文件 。
sort,顾名思义,将对列表进行处理并生成按字母排序的新列表 。
uniq(读做 “unique),扫描列表,比较列表中的相邻元素,以去除任何重复项 。例如,假设您具有以下列表:
清单 1. 列表示例
Groucho
Groucho
Chico
Chico
Groucho
Harpo
Zeppo
Zeppo
uniq 可将列表精简为:
清单 2. uniq 命令
Groucho
Chico
Groucho
Harpo
Zeppo
但是,如果首先对 Marx Brothers 的初始列表进行排序(在连续运行中对多次出现的名称进行重排),运行 uniq 会生成以下结果:
清单 3. 运行 uniq
Chico
Groucho
Harpo
Zeppo
要了解 find、sort 和 uniq 的更多扩展特性,请参阅您的 UNIX 系统中每种实用工具的 man 页 。
输入数据、输出数据和全部数据
独立使用 find 时,总是以文件系统的内容作为输入数据 。但是 sort 和 uniq 则需要从标准输入设备 (stdin) 请求数据输入 。多数情况下,您会使用键盘作为 stdin:例如,您需要输入要排序的数据行 。
默认情况下,find 在标准输出设备(stdout,通常是您的终端窗口)上打印结果 。sort 和 uniq 都将输出打印到 stdout 。
为了说明 stdin 和 stdout,您可在终端窗口中输入以下文本(假设前面的百分号 (%) 为您的 shell 提示符):
清单 4. stdin 和 stdout
% sort
mustache
horn
hat
Control-D
sort 从 stdin 读取您输入的三行文本,并对其进行排序,然后将结果写出到 stdout 。图 1 所示为从命令行运行 sort 和多数 Unix 命令行实用工具的示意图 。
图 1. 典型 UNIX 命令行实用工具从 stdin 读取并写入到 stdout
某些实用工具,例如 find 并不从 stdin 读取内容 。它们是从系统资源(例如文件系统或系统内核)读取需要处理的数据,然后将结果写入到 stdout 。要直观查看 find 的工作方式,请参见以下的图 2 。
图 2. 某些实用工具从系统资源读取数据并将结果写入到 stdout
除了使用 stdin 和 stdout 之外,UNIX 命令还将生成的错误消息输出到一种特殊出口以便进行诊断,该出口通常并不是强制的 。此出口称为标准错误设备(通常简称为 stderr) 。图 3 所示为运行实用工具的简单命令行 。
图 3. Unix 命令生成错误并输出到特殊通道,即标准错误设备
如图 3 中所示,多数 UNIX 命令从终端读取输入,将结果发送到终端,并将错误打印到终端上 。默认情况下,除非另行指定,您的终端既是 stdin 的数据源,也是 stdout 和 stderr 的输出目标 。
数据传输
不过,您可更改 stdin 的源以及 stdout 和 stderr 的目标 。您可强制 stdin 从文本文件、设备(比如连接到计算机的探头)或网络连接中进行读取 。类似地,您可将输出结果发送到文件、设备或网络连接 。在 UNIX 中,所有资源都被视作文件,因此某种源或目标很容易作为另外的源或目标而被接受或产生 。

推荐阅读