分页: 1 / 1

| 与xargs究竟有什么区别?

发表于 : 2012-10-07 14:15
罗非鱼
| 与xargs究竟有什么区别?

|用来将前一个命令的标准输出传递到下一个命令的标准输入,
xargs将前一个命令的标准输出传递给下一个命令,作为它的参数。
好难理解,什么时候用|,什么时候用xargs,他们的区别究竟在哪里?
tiger@debian:~$ ls | wc -l
110
tiger@debian:~$ ls |xargs wc -l
wc: (1000)《统计学》(第四版)—ppt—给教师用: Is a directory
0 (1000)《统计学》(第四版)—ppt—给教师用
50 a50
62 a50~
167017 adobe.deb
837 aliedit.sh
2882469 bsd.img
wc: coreutils-8.5: Is a directory
0 coreutils-8.5
80 coreutils_8.5-1.diff.gz
30 coreutils_8.5-1.dsc
40946 coreutils_8.5.orig.tar.gz
2 dd.sh
3 ddtime.sh
wc: Desktop: Is a directory
0 Desktop

为何
ls |wc -l ls |xargs wc -l 都能成立?
观察发现, ls |wc -l 显示的是当前目录下面的所有文件数目。ls | xargs wc -l 好像是当前目录下面各个文件的长度。
可否帮忙分析一下,我还是有点不 理解。

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-07 14:51
YeLee
xargs可以控制一大堆的参数吧,位置替换啊,等等。

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-07 14:54
eexpress
管道。无限的。作为输入。
xargs,有限的,作为参数。

明显不是一个东西。

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-07 15:09
funicorn
xargs有两个作用

1 提供“源参数”,作为下一条指令的参数来源

2 自动循环,源参数不唯一时自动创建循环进程

你可以把xargs理解为一条流水线

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-07 21:58
aerofox
罗非鱼 写了:| 与xargs究竟有什么区别?

|用来将前一个命令的标准输出传递到下一个命令的标准输入,
xargs将前一个命令的标准输出传递给下一个命令,作为它的参数。
好难理解,什么时候用|,什么时候用xargs,他们的区别究竟在哪里?
xargs 没有这个功能。
xargs 是将用标准输入来构建命令行,就是把标准输入作为命令的参数。要将前一条命令的标准输出作为命令的参数,必须同时有| 和 xargs,| 把标准输出管道到标准输入,xargs 把标准输入转换为命令行参数,二者各司其职。

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-09 19:45
罗非鱼
为何 ls /home/test |rm -rf 不起作用?我将ls的结果传递给rm,为何这个命令不接收这种输入呢?

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-09 19:47
YeLee
为什么rm会接收管道的参数呢?谁告诉你可以的? :em01 :em01 :em01

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-09 20:36
aerofox
罗非鱼 写了:为何 ls /home/test |rm -rf 不起作用?我将ls的结果传递给rm,为何这个命令不接收这种输入呢?
你输入

代码: 全选

rm -rf
它会等待你输入要删除的文件名吗?不会吧,它根本不读标准输入,因而无法处理管道过来的数据。

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-10 9:19
罗非鱼
为何要这样设计这个命令?

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-12 0:54
q_yangguangyouzi
管道是把一个命令的标准输出传递给另一个命令的标准输入,xargs是把一个命令的标准输出以参数的形式传递给命令。功能不同。有些命令不支持管道,就用xargs将来自标准输出的数据以参数的形式传递给这个命令。(ls | wc -l) 是把ls 的标准输出传递给wc的标准输入,wc就象是在处理一个文本文件,(ls > hello.tt && wc -l hello.tt) 而(ls | xargs wc -l)就是 xargs把来自ls的标准输出转换成一个一个的参数传递给 wc,wc 就是在处理好多文件 (for i in `cat hello.tt`;do wc -l $i;done).我这样理解

Re: | 与xargs究竟有什么区别?

发表于 : 2012-10-12 10:13
lilydjwg
管道是把前边程序的标准输入扔给后边程序的标准输入,xargs 是把它的标准输入的东西扔给它后边命令的参数。

你搞清楚什么叫命令行参数什么叫标准输入就明白了。

Re: | 与xargs究竟有什么区别?

发表于 : 2012-11-08 15:57
jeffreyst
举个简单的例子吧,
ls | grep test ##在当前目录下的所有文件命中查找test
ls | xargs grep test ##简单说就是在当前目录下的所有文件的内容中查找test(==grep -r test ./)