利用管道符“|”:可将一个命令的stdout重定向成为另外一个命令的stdin。管道前一个命令的输出与管道后一个命令的输入数据类型要匹配.如果有不匹配的数据,管道后的命令就会把不匹配的数据丢弃。管道符会接受stdout,堵塞stderr的内容。
管道可以把一系列命令连接起来,这意味着第一个命令的输出会作为第二个命令的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出重定向)。
ex1:% ls | grep acme
上例中ls输出了所有文件。这些信息没有直接送到用户屏幕,而是通过管道符送给了grep;grep将含有acme的文件送至屏幕。
ex2:% du -sh * | sort -n
查看当前目录下所有文件和文件夹占用的空间大小。其中 -s表示summary; -h表示human
readable,指人便于阅读的格式。 sort命令是指排序,-n表示按照数大小排序,numeric。
说到管道符,不得不说stdin和stdout。
我们把stdin和stdout看作是linux/unix的一个虚拟文件。linux/unix的所有命令返回的结果都会首先送到stdout中,而不是直接送至屏幕。例如:
% ls
显示过程应该是ls输出的结果送到stdout中,stdout再送至屏幕。而不是直接送到屏幕的。
以ex2为例说明:
“du -sh *”命令的结果送给stdout;管道符“|”将stdout变为“sort
-n”的stdin;“sort -n”再从stdin读出送到屏幕上。
管道,可以说是UNIX中非常重要的一个操作符号.
它的主要作用就是在shell或者shell脚本程序中连接两个(或者更多)命令,将前者命令的标准输出作为后者命令的标准输入。
$ ls -l * | wc -l
以上命令将统计当前目录下的非隐藏文件的数目.
$cat *.txt | wc -c
以上命令统计当前目录下txt文件的总字节数。使用管道也有其自身的限制,管道前者的命令必须能够产生标准输出,而管道后面所连接的命令也必须能够接受从标准输入流来的信息,管道所起的作用就是承接前者的输出继而将这些字符原封不动的填入后者的输入,它相当于一个中介者。
假如一个命令组合中有两个以上的管道符出现,那么被夹在其中(非首尾)的命令必须既能接受标准输入又能产生标准输出,整条命令才能正常工作。
可以说,正是因为有了管道符号(当然还有一些其他的特征)的存在,UNIX下shell的功能才如此强大,多变的命令组合方式,强大的可操作性。