我正在通过Shell(Bash)Scripting的入门试验,并有以下疑问:
为什么以下命令不打印
cp's
目录的内容:which cp | ls -l
根据定义,管道是否意味着我们将一个命令的输出传递给另一个命令,即重定向输出?
有人可以帮帮我吗?我是新手..
答案 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)一次或多次 参数后跟从标准输入读取的项。空白行 标准输入被忽略。