【发布时间】:2015-10-06 22:46:47
【问题描述】:
一个简单的问题。 一条命令
cat * | wc -c
不需要 xargs,但需要命令
ls | xargs echo
需要 xargs 命令。 请有人更清楚地向我解释 xargs 的概念。 谢谢。
【问题讨论】:
一个简单的问题。 一条命令
cat * | wc -c
不需要 xargs,但需要命令
ls | xargs echo
需要 xargs 命令。 请有人更清楚地向我解释 xargs 的概念。 谢谢。
【问题讨论】:
简而言之,xargs 将stdin(标准输入)转换为您指定命令的参数。例如
$ seq 1 3
1
2
3
$ seq 1 3 | xargs echo
1 2 3
seq,如您所见,将序列打印到stdout。我们通过管道将 (|) 输出到stdin 上的xargs。 xargs 以stdin 作为参数调用echo,所以我们得到echo 1 2 3。
作为el.pescado said,wc 接受stdin 上的输入(您也可以给它一个文件参数)。因为cat 将文件打印到stdout,所以您可以将其直接通过管道传输到wc。
$ cat text
This is only
a test
$ cat text | wc
2 5 20
$ wc text
2 5 20 text
echo 不接受来自stdin 的任何内容。这会很奇怪,因为echo 的工作是打印到stdout - 你已经可以打印任何你想用管道传输的东西了。因此,您使用xargs 将流转换为参数。
echo 可能是一个太简单的命令,无法查看发生了什么,所以这里有一个更真实的示例。假设我们有一个目录,其中包含一些文件:
$ ls
bar1 foo1 foo2 foo3 foo4 foo5 foo6
foo 到此为止,我们想删除所有这些,但我们懒得输入rm foo1 foo2 ...。毕竟,我们是程序员,而且我们很懒惰。我们能做的是……
$ ls foo* | xargs rm
$ ls
bar1
rm 需要参数,ls foo* 打印我们要删除的每个文件,xargs 进行翻译。
附带说明,有时您希望将stdin 拆分成更小的部分。 xargs -n 对此非常有用,它一次将 N 个参数传递给您的最终命令。
$ ls foo* | xargs -n2 echo
foo1 foo2
foo3 foo4
foo5 foo6
【讨论】:
wc 从其标准输入 读取数据,而echo 打印其命令行参数。
【讨论】: