有时需要将一个命令的输出作为另一个命令的输入。这可以用重定向来实现,只是有些笨拙。
$ rpm -qa > rpm.list
$ sort < rpm.list
abrt-1.1.14-1.fc14.i686
abrt-addon-ccpp-1.1.14-1.fc14.i686
abrt-addon-kerneloops-1.1.14-1.fc14.i686
abrt-addon-python-1.1.14-1.fc14.i686
abrt-desktop-1.1.14-1.fc14.i686
abrt-gui-1.1.14-1.fc14.i686
abrt-libs-1.1.14-1.fc14.i686
abrt-plugin-bugzilla-1.1.14-1.fc14.i686
abrt-plugin-logger-1.1.14-1.fc14.i686
abrt-plugin-runapp-1.1.14-1.fc14.i686
acl-2.2.49-8.fc14.i686
[…]
rpm命令通过Red Hat包管理系统(RPM)对系统(比如上例中的Fedora系统)上安装的软件
包进行管理。配合-qa选项使用时,它会生成已安装包的列表,但这个列表并不会遵循某种特定
的顺序。如果你在查找某个或某组特定的包,想在rpm命令的输出中找到就比较困难了。
通过标准输出重定向,rpm命令的输出被重定向到了文件 rpm.list。命令完成后,rpm.list保存
着系统中所有已安装的软件包列表。接下来,输入重定向将rpm.list文件的内容发送给sort命令,
该命令按字母顺序对软件包名称进行排序。
这种方法的确管用,但仍然是一种比较繁琐的信息生成方式。我们用不着将命令输出重定向
到文件中,可以将其直接重定向到另一个命令。这个过程叫作管道连接(piping)。
和命令替换所用的反引号(`)一样,管道符号在shell编程之外也很少用到。该符号由两个
竖线构成,一个在另一个上面。然而管道符号的印刷体通常看起来更像是单个竖线(|)。在美式
键盘上,它通常和反斜线(\)位于同一个键。管道被放在命令之间,将一个命令的输出重定向
到另一个命令中:
command1 | command2
不要以为由管道串起的两个命令会依次执行。Linux系统实际上会同时运行这两个命令,在
系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据
传输不会用到任何中间文件或缓冲区。
现在,可以利用管道将rpm命令的输出送入sort命令来产生结果。
$ rpm -qa | sort
abrt-1.1.14-1.fc14.i686
abrt-addon-ccpp-1.1.14-1.fc14.i686
abrt-addon-kerneloops-1.1.14-1.fc14.i686
abrt-addon-python-1.1.14-1.fc14.i686
abrt-desktop-1.1.14-1.fc14.i686
abrt-gui-1.1.14-1.fc14.i686
abrt-libs-1.1.14-1.fc14.i686
abrt-plugin-bugzilla-1.1.14-1.fc14.i686
abrt-plugin-logger-1.1.14-1.fc14.i686
abrt-plugin-runapp-1.1.14-1.fc14.i686
acl-2.2.49-8.fc14.i686
[…]
除非你的眼神特别好,否则可能根本来不及看清楚命令的输出。由于管道操作是实时运行的,
所以只要rpm命令一输出数据,sort命令就会立即对其进行排序。等到rpm命令输出完数据,sort
命令就已经将数据排好序并显示了在显示器上。
可以在一条命令中使用任意多条管道。可以持续地将命令的输出通过管道传给其他命令来细
化操作。
在这个例子中,sort命令的输出会一闪而过,所以可以用一条文本分页命令(例如less或
more)来强行将输出按屏显示。
$ rpm -qa | sort | more
这行命令序列会先执行rpm命令,将它的输出通过管道传给sort命令,然后再将sort的输
出通过管道传给more命令来显示,在显示完一屏信息后停下来。这样你就可以在继续处理前停
下来阅读显示器上显示的信息,如图11-1所示。
如果想要更别致点,也可以搭配使用重定向和管道来将输出保存到文件中。
$ rpm -qa | sort > rpm.list
$ more rpm.list
abrt-1.1.14-1.fc14.i686
abrt-addon-ccpp-1.1.14-1.fc14.i686
abrt-addon-kerneloops-1.1.14-1.fc14.i686
abrt-addon-python-1.1.14-1.fc14.i686
abrt-desktop-1.1.14-1.fc14.i686
abrt-gui-1.1.14-1.fc14.i686
abrt-libs-1.1.14-1.fc14.i686
abrt-plugin-bugzilla-1.1.14-1.fc14.i686
abrt-plugin-logger-1.1.14-1.fc14.i686
abrt-plugin-runapp-1.1.14-1.fc14.i686
acl-2.2.49-8.fc14.i686
[…]
不出所料,rpm.list文件中的数据现在已经排好序了。
到目前为止,管道最流行的用法之一是将命令产生的大量输出通过管道传送给more命令。
这对ls命令来说尤为常见,如图11-2所示。
ls -l命令产生了目录中所有文件的长列表。对包含大量文件的目录来说,这个列表会相当
长。通过将输出管道连接到more命令,可以强制输出在一屏数据显示后停下来。