| 与xargs究竟有什么区别?

sh/bash/dash/ksh/zsh等Shell脚本
回复
罗非鱼
帖子: 980
注册时间: 2008-04-12 12:44

| 与xargs究竟有什么区别?

#1

帖子 罗非鱼 » 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 好像是当前目录下面各个文件的长度。
可否帮忙分析一下,我还是有点不 理解。
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

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

#2

帖子 YeLee » 2012-10-07 14:51

xargs可以控制一大堆的参数吧,位置替换啊,等等。
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

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

#3

帖子 eexpress » 2012-10-07 14:54

管道。无限的。作为输入。
xargs,有限的,作为参数。

明显不是一个东西。
● 鸣学
funicorn
帖子: 1318
注册时间: 2005-09-13 4:56
系统: Ubuntu Jammy Jellyfi

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

#4

帖子 funicorn » 2012-10-07 15:09

xargs有两个作用

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

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

你可以把xargs理解为一条流水线
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

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

#5

帖子 aerofox » 2012-10-07 21:58

罗非鱼 写了:| 与xargs究竟有什么区别?

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

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

#6

帖子 罗非鱼 » 2012-10-09 19:45

为何 ls /home/test |rm -rf 不起作用?我将ls的结果传递给rm,为何这个命令不接收这种输入呢?
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

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

#7

帖子 YeLee » 2012-10-09 19:47

为什么rm会接收管道的参数呢?谁告诉你可以的? :em01 :em01 :em01
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

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

#8

帖子 aerofox » 2012-10-09 20:36

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

代码: 全选

rm -rf
它会等待你输入要删除的文件名吗?不会吧,它根本不读标准输入,因而无法处理管道过来的数据。
罗非鱼
帖子: 980
注册时间: 2008-04-12 12:44

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

#9

帖子 罗非鱼 » 2012-10-10 9:19

为何要这样设计这个命令?
q_yangguangyouzi
帖子: 37
注册时间: 2012-03-06 0:22

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

#10

帖子 q_yangguangyouzi » 2012-10-12 0:54

管道是把一个命令的标准输出传递给另一个命令的标准输入,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).我这样理解
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

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

#11

帖子 lilydjwg » 2012-10-12 10:13

管道是把前边程序的标准输入扔给后边程序的标准输入,xargs 是把它的标准输入的东西扔给它后边命令的参数。

你搞清楚什么叫命令行参数什么叫标准输入就明白了。
jeffreyst
帖子: 3
注册时间: 2012-11-08 15:17
系统: ubuntu12.4

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

#12

帖子 jeffreyst » 2012-11-08 15:57

举个简单的例子吧,
ls | grep test ##在当前目录下的所有文件命中查找test
ls | xargs grep test ##简单说就是在当前目录下的所有文件的内容中查找test(==grep -r test ./)
回复