man xargs 表示标准输入由空格分隔;但这是吗?

man xargs 表示标准输入由空格分隔;但这是吗?

我对实际定义什么感到困惑精氨酸xargs
手册页似乎建议参数由空格分隔(我认为这意味着空格)。但是,以下脚本的行为并不符合我的预期。以下是 man 描述部分的摘录:

xargs 从标准输入中读取项目,以空格(可以用双引号、单引号或反斜杠保护)或换行符分隔,然后执行命令 ...

看来 xargs 可能适用于手册页的内容项目。这意味着一个null-delimited项目,还是一个newline分隔项目?

基本上,我不明白为什么在下面的脚本中将xargs输入视为单个参数,即使空格(在标准输入中)是不受保护。我希望xargs将 stdin 视为 3 个参数,或者至少将多个空格减少为单个空格,但它两者都没有!

#!/bin/bash
if [[ $1 == "." ]] ;then  # act on a recursive call to self
    shift                 # scrap the 'recursive' arg
    printf '|%s|\n' "$@"  # print all 'xargs' args
    printf '|%s|\n' "$1"  # print only the first 'xargs' arg
    exit
fi
printf 'a    b    c\n' |xargs -I {} "$0" "." {}   

这是输出;显示只有一个参数传递给脚本。

|a    b    c|
|a    b    c|

但我期望有 3 个独立的参数,如下所示:

|a|
|b|
|c|

答案1

-I阅读手册页关于您正在使用的option 的说明:

-I 替换-str

将初始参数中出现的replace-str 替换为从标准输入读取的名称。 此外,不带引号的空格不会终止输入项;相反,分隔符是换行符。

答案2

不,这不是关于“块”与“物品”的问题,这只是术语的转变。接受用or引用并用空格分隔xargs的输入,除非传递某些选项。'"

某些选项更改为不带引号的逐行处理:-I, -L, -i(GNU), -l(GNU)。该选项-0(如果可用)更改为不带引号的空分隔输入。选项-d(GNU) 更改为不带引号的自定义分隔符。

答案3

制作 GNU Parallel 的原因之一是使其比 xargs 更具可预测性。https://www.gnu.org/software/parallel/history.html

如果您对 xargs 解释参数的方式感到困惑,请考虑使用 GNU Parallel。

您可以简单地通过以下方式安装 GNU Parallel:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

观看 GNU Parallel 的介绍视频以了解更多信息: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

相关内容