输入0
echo foo | xargs -L 1 -I '{}' echo '{}'
输出0
foo
输入1
echo foo | xargs -I '{}' -L 1 echo '{}'
输出1
{} foo
为什么更改 xargs 选项的顺序会改变输出?
版本:xargs (GNU findutils) 4.6.0
答案1
当给 xargs 的选项发生冲突时,顺序可能很重要。
IEEE Std 1003.1-2008,2016 年版/开放组基本规范第 7 期将以下文本1添加到 xargs 规范中:
这-我,-L, 和-n选项是互斥的。如果在命令行上给出了多个,则某些实现会使用最后指定的一个;其他实现以不同的方式处理选项的组合。
这编码了 xargs 的许多实现的行为,可以追溯到 PWB/Unix 中的原始版本,其手册页说
当存在标志冲突时(例如,-l与-n),最后一个标志优先。
在 xargs 的 GNU 版本中,-L
禁用任何先前的-I
选项。所以在你的第二个例子中,
echo foo | xargs -I '{}' -L 1 echo '{}'
{}
只是传递给 的普通参数echo
,没有进行任何替换。