Linux命令:为什么重定向操作符 - |管道在这里失败?

时间:2015-04-17 06:52:54

标签: linux bash shell pipe sh

我正在通过Shell(Bash)Scripting的入门试验,并有以下疑问:

  
      
  • 为什么以下命令不打印cp's目录的内容:which cp | ls -l

  •   
  • 根据定义,管道是否意味着我们将一个命令的输出传递给另一个命令,即重定向输出?

  •   

有人可以帮帮我吗?我是新手..

2 个答案:

答案 0 :(得分:5)

which的输出通过管道传输到ls的标准输入。但是,ls不会对标准输入采取任何措施。你想要它(我推测)作为参数传递。有几种方法可以做到这一点:

which cp | xargs ls -l

ls -l `which cp`

ls -l $(which cp)

在第一个示例中,xargs命令采用上一个上一个命令的标准输出,并使每一行成为名称紧跟xargs之后的命令的参数。所以,例如

find / | xargs ls -l

会对文件系统中的每个文件执行ls -l(这有一些问题与特殊命名的文件有关,但这超出了本答案的范围)。

其余两个大致相同,并使用shell执行此操作,将which的输出扩展到cp的命令行。

答案 1 :(得分:2)

会是,

$ ls -l $(which cp)
-rwxr-xr-x 1 root root 130304 Mar 24  2014 /bin/cp

OR

$ which cp | xargs ls -l
-rwxr-xr-x 1 root root 130304 Mar 24  2014 /bin/cp

要将一个命令的输出作为另一个命令的参数传递,您需要使用xargs和管道符号。

来自man xargs

  

xargs - 从标准input.xargs构建和执行命令行读取项目          来自标准输入,由空格分隔(可以保护          使用双引号或单引号或反斜杠)或换行符,并执行          任何初始命令(默认为/ bin / echo)一次或多次          参数后跟从标准输入读取的项。空白行          标准输入被忽略。