首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解UNIX命令xargs

理解UNIX命令xargs
EN

Stack Overflow用户
提问于 2009-12-13 22:31:25
回答 5查看 28.2K关注 0票数 36

我对这件事很困惑。需要澄清一下。

示例1 :

代码语言:javascript
复制
pgrep string | xargs ps

示例2 :

代码语言:javascript
复制
find . | xargs grep whatever

从示例1中,我猜是这样的:

搜索一个"string“,它是正在运行的进程名称的一部分,并将所有匹配的进程is返回给'xargs ps‘->,它只是将ps附加到匹配项(进程is本身),以获得与以下相同的输出:

代码语言:javascript
复制
ps <processid>

有人能解释一下xargs在这种情况下到底做了什么吗?

从示例2中,我猜是这样的:

它是从当前工作目录中递归地搜索某个“字符串”。在这里,“xargs”到底是如何工作的?

我认为“xargs”反复将标准输入的数据附加到给xargs的“参数”(通常是UNIX命令本身)。

来自xargs()手册页:

xargs从标准输入中读取项,用空格分隔(可以用双引号或单引号或反斜杠来保护)或换行符,并使用任何初始参数和从标准输入读取的项执行一次或多次命令(默认值为/bin/echo)。忽略标准输入上的空行。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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的当前值)。这就是它如何避免那些可怕的“参数列表到长”错误。

票数 58
EN

Stack Overflow用户

发布于 2009-12-13 22:46:39

xargs所做的一个很好的例子是尝试使用find为目录中的每个文件获取排序校验和。

代码语言:javascript
复制
find . | cksum  | sort

只返回一个校验和,它不清楚它是什么校验和。不是我们想要的。管子把从find到stdin的stdout发送给cksum。cksum真正想要的是命令行args的列表。

代码语言:javascript
复制
cksum file001.blah file002.blah  file003.blah

将报告三行,每个文件一行,并提供所需的校验和。Xargs做了一个魔术--将上一个程序的stdout转换为一个临时和隐藏的命令行,以提供给下一个命令行。工作的命令行是:

代码语言:javascript
复制
find . | xargs cksum | sort

注意,在xargs和cksum之间没有管道。

票数 15
EN

Stack Overflow用户

发布于 2009-12-13 22:41:26

代码语言:javascript
复制
$ echo 'line1
> line2
> line3
> ...
> lineN ' | xargs cmd1 -a -b

将导致:

代码语言:javascript
复制
$ cmd1 -a -b line1 line2 line3 ... lineN

如果行数太大,xargs会将cmd1 ...分成几个cmd1的执行部分。

xargs可用于与将stdin行作为位置参数传递有关的许多其他任务。查看一下用于并行运行多个命令实例的xargs(1)中的大写xargs(1)选项。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1898044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档