【发布时间】:2015-04-17 06:52:54
【问题描述】:
我正在阅读有关 Shell (Bash) 脚本的入门知识,但有以下疑问:
为什么下面的命令不打印
cp's目录的内容:which cp | ls -l根据定义不管道是否意味着我们将一个命令的输出传递给另一个命令,即重定向输出?
有人可以帮帮我吗?我是新手..
【问题讨论】:
我正在阅读有关 Shell (Bash) 脚本的入门知识,但有以下疑问:
为什么下面的命令不打印
cp's目录的内容:which cp | ls -l根据定义不管道是否意味着我们将一个命令的输出传递给另一个命令,即重定向输出?
有人可以帮帮我吗?我是新手..
【问题讨论】:
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 的命令行。
【讨论】:
ls -l /path/to/file 并按回车时,该命令是否等待您通过键盘提供更多数据?不,它没有。像tr a z 这样的东西会。
which cp | nl 让nl 对其接收的行进行编号。这是读取和处理其标准输入的命令的另一个示例;其他流行的例子有head、tail、sed、tac、read等。
会的,
$ ls -l $(which cp)
-rwxr-xr-x 1 root root 130304 Mar 24 2014 /bin/cp
或
$ which cp | xargs ls -l
-rwxr-xr-x 1 root root 130304 Mar 24 2014 /bin/cp
要将一个命令的输出作为另一个命令的参数传递,您需要使用xargs 和管道符号。
来自man xargs
xargs - 从标准输入构建和执行命令行。xargs 读取项目 来自标准输入,由空格分隔(可以保护 带双引号或单引号或反斜杠)或换行符,并执行 该命令(默认为 /bin/echo)一次或多次,带有任何初始 - 参数后跟从标准输入读取的项目。上的空行 标准输入被忽略。
【讨论】: