xargs:选项的顺序重要吗?

Cyk*_*ker 4 xargs

输入 0

echo foo | xargs -L 1 -I '{}' echo '{}'
Run Code Online (Sandbox Code Playgroud)

输出 0

foo
Run Code Online (Sandbox Code Playgroud)

输入 1

echo foo | xargs -I '{}' -L 1 echo '{}'
Run Code Online (Sandbox Code Playgroud)

输出 1

{} foo
Run Code Online (Sandbox Code Playgroud)

为什么更改 xargs 的选项顺序会更改输出?

版本: xargs (GNU findutils) 4.6.0

Mar*_*ick 7

当提供给 xargs 的选项发生冲突时,顺序可能很重要。

IEEE Std 1003.1-2008, 2016 Edition/Open Group Base Specifications Issue 7在xargs 的规范中添加了以下文本1

-I-L-n选项是相互排斥的。如果命令行上给出了多个,则某些实现使用指定的最后一个;其他实现以不同的方式处理选项的组合。

这编纂了 xargs 的许多实现的行为,回到 PWB/Unix 中的原始版本,其手册页

当存在标志冲突(例如,-l-n)时,最后一个标志具有优先权。

在 xargs 的 GNU 版本中,-L禁用任何先前的-I选项。所以在你的第二个例子中,

echo foo | xargs -I '{}' -L 1 echo '{}'
Run Code Online (Sandbox Code Playgroud)

{}只是传递给 的普通参数echo,没有进行任何替换。

[1]IEEE Std 1003.1, 2004 Edition/Open Group Base Specifications Issue 6 相比