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 替换为从标准输入读取的名称。 此外,不带引号的空格不会终止输入项;相反,分隔符是换行符。

おすすめ記事