通道符和xargs命令
通道符“|“:是将前一个命令的输出做为后一个命令的标准输入。注意:这里的标准输入指的是:通道符右侧命令的处理内容,也就是说左侧的标准输出不能作为右侧命令的参数,只能作为命令的处理对象。
简单讲:只有通道符时,右侧命令将左侧输出作为处理内容。加上xargs后,将左侧输出作为参数。具体看下面wc命令的执行,就明白了。
写起来都很别扭,理解起来也费劲啊,还是举例子吧:
1、环境:假设当前目录下,tesy文件夹内有3个文件,t1.c,t2.c,t3.c
t1.c内容:
hello,I am t1
ok
t2.c内容:
this is t2
t3.c内容:
I am t3
I have 3 lines
look it
然后,我再当前目录建立一个文件t,内容如下:
t1.c
t2.c
t3.c
最后,我在当前目录执行: cat t | ls -l
[root@noi ~]# cat t | ls -l total 8 -rw-r--r-- 1 root root 30 Jun 8 12:11 t drwxr-xr-x 2 root root 4096 Jun 8 12:10 tesy
也输出了内容,和我们的想法不一样,我们想的是将t文件内的文件列表传给ls命令,然后一一列出详细属性。但是显然输出的不对,那么这些到底是怎么运作的呢?
cat t命令产生的标准输出通过通道符传给了ls命令,但是ls命令抛弃了,因为ls命令不能处理流,它不是一个文本处理软件,然后ls独自运行,因为没有参数,所以最终执行的命令是:
ls -l
就将当前目录作为默认参数,显示出来。
然后运行:
cat t | xagrs ls -l
[root@noi ~]# cat t | xargs ls -l -rw-r--r-- 1 root root 18 Jun 8 12:10 tesy/t1.c -rw-r--r-- 1 root root 11 Jun 8 12:09 tesy/t2.c -rw-r--r-- 1 root root 31 Jun 8 12:09 tesy/t3.c
看到没?正确执行了我们的意图。xargs命令将从cat t得到的标准输出,作为参数传递给ls命令,这样ls命令得到3个参数,最终执行: ls -l t1.c t2.c t3.c
2、如果上题还有疑问,那么wc命令将最终为您解惑:
执行:
cat t | wc -l
wc命令将cat的输出作为处理内容,进行计算,最终输出3,表示有3行。
[root@noi ~]# cat t | wc -l 3
执行:
cat t | xargs wc -l
xargs将cat输出的3行作为wc的参数传递进来,于是最终执行: wc -l t1.c t2.c t3.c
[root@noi ~]# cat t | xargs wc -l 2 tesy/t1.c 1 tesy/t2.c 3 tesy/t3.c 6 total
看到没?wc最终计算的是t1.c,t2.c,t3.c这三个文件,而不是t文件。这就是xargs的作用,将标准输出转为命令的参数,而不是命令的处理内容。