我对这件事很困惑。需要澄清一下。
示例1 :
pgrep string | xargs ps示例2 :
find . | xargs grep whatever从示例1中,我猜是这样的:
搜索一个"string“,它是正在运行的进程名称的一部分,并将所有匹配的进程is返回给'xargs ps‘->,它只是将ps附加到匹配项(进程is本身),以获得与以下相同的输出:
ps <processid>有人能解释一下xargs在这种情况下到底做了什么吗?
从示例2中,我猜是这样的:
它是从当前工作目录中递归地搜索某个“字符串”。在这里,“xargs”到底是如何工作的?
我认为“xargs”反复将标准输入的数据附加到给xargs的“参数”(通常是UNIX命令本身)。
来自xargs()手册页:
xargs从标准输入中读取项,用空格分隔(可以用双引号或单引号或反斜杠来保护)或换行符,并使用任何初始参数和从标准输入读取的项执行一次或多次命令(默认值为/bin/echo)。忽略标准输入上的空行。
发布于 2009-12-14 19:12:06
一般来说,xargs是这样使用的
prog | xargs utility
其中,prog需要输出一个或多个分隔的换行符/空格。诀窍是,xargs不一定对每个结果调用一次utility,而是将结果拆分为子列表,并对每个子列表调用utility。如果要强制xargs对每个结果调用utility,则需要使用xargs -L1调用它。
注意,xargs向您保证发送给utility的子列表比ARG_MAX短(如果您好奇,可以使用getconf ARG_MAX获取ARG_MAX的当前值)。这就是它如何避免那些可怕的“参数列表到长”错误。
发布于 2009-12-13 22:46:39
xargs所做的一个很好的例子是尝试使用find为目录中的每个文件获取排序校验和。
find . | cksum | sort只返回一个校验和,它不清楚它是什么校验和。不是我们想要的。管子把从find到stdin的stdout发送给cksum。cksum真正想要的是命令行args的列表。
cksum file001.blah file002.blah file003.blah将报告三行,每个文件一行,并提供所需的校验和。Xargs做了一个魔术--将上一个程序的stdout转换为一个临时和隐藏的命令行,以提供给下一个命令行。工作的命令行是:
find . | xargs cksum | sort注意,在xargs和cksum之间没有管道。
发布于 2009-12-13 22:41:26
$ echo 'line1
> line2
> line3
> ...
> lineN ' | xargs cmd1 -a -b将导致:
$ cmd1 -a -b line1 line2 line3 ... lineN如果行数太大,xargs会将cmd1 ...分成几个cmd1的执行部分。
xargs可用于与将stdin行作为位置参数传递有关的许多其他任务。查看一下用于并行运行多个命令实例的xargs(1)中的大写xargs(1)选项。
https://stackoverflow.com/questions/1898044
复制相似问题