GNU xargs
有选项'-x'。该手册页说:
-x如果超出大小(请参阅-s选项),则退出。
但xargs
似乎并不关心-x
是否设置。我一直无法举例说明-x
有任何影响。
请提供两个示例,其中唯一的区别是添加-x
并产生不同的输出。
答案 0 :(得分:4)
您必须设置尺寸以测试是否超出了它。
$ echo -e "12\n1234"
12
1234
$ echo -e "12\n1234" | xargs echo
12 1234
$ echo -e "12\n1234" | xargs -x echo # no effect
12 1234
$ echo -e "12\n1234\n13" | xargs -s 8 echo # process valid args until an error occurs
xargs: argument line too long
12
$ echo -e "12\n1234" | xargs -s 8 -x echo # error and exit
xargs: argument line too long
答案 1 :(得分:1)
我仍然无法解释为什么这会给出1 - 11:
(seq 11; echo -e "1234111";seq 12 15) | xargs -s 11 echo
但这给出1 - 9:
(seq 11; echo -e "1234111";seq 12 15) | xargs -s 11 -x echo
-x
总是只会给出一行(即过长的行)的差异吗?
这当然取决于您使用的xargs
的类型,但是流行的GNU findutils' xargs
(可能是你拥有的那个)具有这种行为,违反了最不惊讶的原则:它通过重复读取下一个输入项并将其附加到现有命令行,在内存中累积命令行,直到它不适合行长度...现在,它检查读取的项目是否甚至不能作为单个参数排在一行中(在您的示例中是echo 1234111
的情况):
if (p >= endbuf)
{
exec_if_possible ();
error (EXIT_FAILURE, 0, _("argument line too long"));
}
(上面的代码在findutils-4.6.0 / xargs / xargs.c中接近函数read_line()
的末尾,在findutils-4.4.2中几乎相同)
static void
exec_if_possible (void)
{
if (bc_ctl.replace_pat || initial_args ||
bc_state.cmd_argc == bc_ctl.initial_argc || bc_ctl.exit_if_size_exceeded)
return;
bc_do_exec (&bc_ctl, &bc_state);
}
这里的选项-x
(对应bc_ctl.exit_if_size_exceeded
)会产生影响 - -x
,exec_if_possible()
只有return
s没有{{ 1}已经累积的格式良好的命令(在你的例子中为bc_do_exec()
)。然后在echo 10 11
之后,函数return
退出error()
程序。
我有点期待他们中的12到15岁。
因为如果输入项目本身太长,所述xargs
总是退出,则以下所有项都会丢失。
答案 2 :(得分:0)
<强> TL;博士强>
使用-x
仅对-n <argumentCount>
: <argumentCount>
参数有意义,如果可用,必须适合单个命令行,基于隐式字节数最大值或显式指定的-s <byteCount+1>
选项;如果没有,xargs
退出并出错
如果没有-x
,将构造一个带有更少参数的命令行,并且不会发生任何错误 - 除非单个参数适合 - 见下一点。
-x
逻辑隐含适用于-L <lineCount>
和-I <placeHolder>
选项。-x
和-n
的组合似乎已损坏 xargs
的 BSD 实施 - 见下文。 没有-n
,没有理由使用-x
,因为两个xargs
实现总是退出遇到单个参数时会出现错误,该参数会导致对整个字节大小限制的命令过长(同样,隐含或使用-s <byteCount+1>
指定)。
xargs
:-x
没有-n
表示错误 (自v4起)。 2.2),如Armali's hepful answer中所发掘的那样。xargs
:-x
没有-n
语法不支持。-x
,一个太长的参数也会导致错误:
$ echo 1 10 | xargs -s 7 echo # max. command length is 6 (7 - 1) bytes
1 # ok: 'echo 1' is 6 bytes
xargs: argument line too long # 'echo 10' is too long
以下 GNU xargs
示例:
-x
)或必须对每个命令实例使用( with -x
):-n 2
-s 9
注意:使用 BSD xargs
,下面的否 -x
示例的工作方式相同,-x
示例应工作,但不适用于在OSX 10.11.3和PC-BSD 10.1上找到的xargs
版本:每当指定-x
时,指定的{{ 1}} <argumentCount>
中的值被忽略,-n <argumentCount>
的行为就像指定了xargs
一样。
功能
-n 1
注意在最后一次成功执行的命令之前如何错误地打印错误消息;这可能与上面提到的错误有关,因此Armali's answer可能会提供解释。