![从标准输入转换的参数数量是否必须与命令中占位符的数量相同?](https://linux22.com/image/144325/%E4%BB%8E%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E8%BD%AC%E6%8D%A2%E7%9A%84%E5%8F%82%E6%95%B0%E6%95%B0%E9%87%8F%E6%98%AF%E5%90%A6%E5%BF%85%E9%A1%BB%E4%B8%8E%E5%91%BD%E4%BB%A4%E4%B8%AD%E5%8D%A0%E4%BD%8D%E7%AC%A6%E7%9A%84%E6%95%B0%E9%87%8F%E7%9B%B8%E5%90%8C%EF%BC%9F.png)
当xargs
从标准输入流创建多个参数时(-d
可以指定用于将标准输入流拆分为多个参数的分隔符),如何xargs
在要执行的命令中重新排列它们?
xargs
有一个选项-I
可以指定命令中的占位符以替换参数。当xargs
从 stdin 输入流创建多个参数时,占位符出现的次数是否必须与参数的数量相同?
例如,从标准输入转换的参数数量是否必须与命令中占位符的数量相同?
$ xargs -I x -d " " ls x x x
-l -t -r
答案1
你可以自己尝试一下
$ echo -n a b c d e f g | xargs -I x -d " " echo x x x
a a a
b b b
c c c
d d d
e e e
f f f
g g g
从手册中:
-I Replace-str
用从标准输入读取的名称替换初始参数中出现的replace-str。此外,不带引号的空格不会终止输入项;相反,分隔符是换行符。 意味着 -x 和 -L 1。-L max-lines
每个命令行最多使用 max-lines 非空白输入行。尾随空白导致输入行在逻辑上继续到下一个输入行。意味着-x。
因此-I
意味着-L 1
每次调用仅使用一个参数。正如您所看到的,每次出现的x
都被替换为参数。
还有一个乍一看可能会令人惊讶的效果:
$ echo a b c d e f g | xargs -I x -d " " echo x x x
a a a
b b b
c c c
d d d
e e e
f f f
g
g
g
如果没有选项-n
,echo 将在末尾输出换行符。使用 option 时-d
,xargs
不会将换行符视为分隔符,而是参数的一部分,因此g\n
:的输出中会出现换行符g\n g\n g\n
。