不带任何参数执行“| xargs”有什么好处吗?

问题描述 投票:0回答:3

我遇到过不带任何参数执行

| xargs
的脚本。我开始删除此类事件,因为脚本在没有它们的情况下也可以工作,但想验证我没有遗漏某些内容。也许 xargs 默认会清理某些字符等。

... | cut -d: -f2- | xargs

上面的

| xargs
有什么意义吗?预先感谢。

bash xargs
3个回答
5
投票

不带任何参数

xargs
会将输出中的所有行合并为一行,并删除多余的空格:

$ echo $'a   b\nb'
a   b
b

$ echo $'a   b\nb' | xargs
a b b

请注意,只有当 xargs 的输入小于命令缓冲区的最大大小时,这才有效。请参阅下面的示例:

$ seq 100 | xargs | wc -l
1
$ seq 1000000 | xargs | wc -l
53

2
投票

默认情况下,

xargs
会调用
echo
,因此有时会使用它来展平输入,但在此之前,您需要注意一些事项:

  1. 它会修剪前导/尾随/重复的空格(这可能就是您想要的):

    printf '%s\n' '  a' 'b  b' 'c  ' | xargs
    
    a b b c
    
  2. 正如@user000001所解释的,当输入超过ARG_MAX时,

    echo
    将被多次调用,导致多行输出。

  3. xargs
    有自己的转义规则:
    \
    '
    "
    不会被视为文字字符串:

    printf '%s\n' "I'll be there" | xargs
    
    xargs: unmatched single quote
    
  4. echo
    有未定义的行为;的输出

    printf '%s\n' 'a\\nb' | xargs    # \\ means \ for xargs
    

    可能是

    a\nb
    

    以及

    a
    b
    

旁白

对于压平输入的可靠方法,我将替换:

... | xargs

与:

... | paste -sd ' ' | sed 's/ \+/ /g; s/^ //; s/ $//'

注意:

sed
用于修剪前导/尾随/重复的空格


1
投票

根据 @user000001 的回答,将标准输入中的空格(包括换行符)“清理”为单行单空格分隔值非常有用。

当您需要在 shell CLI 中“加入”这些值(

join
,我的意思是在所有值之间添加分隔符)时,就会出现一个有趣的用例,例如,您想要将当前中所有文件的大小相加目录(类似于
du
):

$ stat *|sed -n 's/^size//p'|xargs
5589886 11669381 4096 1743 2467 4096 22447289 1784723 27472 203 4096 525 4096 4096 4511158 268533 131068 150307 75658 12288 4096 4096 102762 4096 4096 4096 7296 5782043 4096 4096 779 14855386 895468 4096 4096 227

# replace each single whitespace from `xargs` by `+` and pipe it to `bc`
# to get the sum of all numbers
$ stat *|sed -n 's/^size//p'|xargs|sed 's/ /+/g'|bc -l
68374006
© www.soinside.com 2019 - 2024. All rights reserved.