zoukankan      html  css  js  c++  java
  • 通道符和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的作用,将标准输出转为命令的参数,而不是命令的处理内容。

  • 相关阅读:
    hdu 5366 简单递推
    hdu 5365 判断正方形
    hdu 3635 并查集
    hdu 4497 数论
    hdu5419 Victor and Toys
    hdu5426 Rikka with Game
    poj2074 Line of Sight
    hdu5425 Rikka with Tree II
    hdu5424 Rikka with Graph II
    poj1009 Edge Detection
  • 原文地址:https://www.cnblogs.com/litifeng/p/6962179.html
Copyright © 2011-2022 走看看