运行中xargs'-x选项的示例

时间:2010-06-12 01:22:37

标签: shell xargs

GNU xargs有选项'-x'。该手册页说:

  

-x如果超出大小(请参阅-s选项),则退出。

xargs似乎并不关心-x是否设置。我一直无法举例说明-x有任何影响。

请提供两个示例,其中唯一的区别是添加-x并产生不同的输出。

3 个答案:

答案 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)会产生影响 - -xexec_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>选项。
    • 警告:从OSX 10.11.3和PC-BSD 10.1开始,-x-n的组合似乎已损坏 xargs BSD 实施 - 见下文。
  • 没有-n,没有理由使用-x ,因为两个xargs实现总是退出遇到单个参数时会出现错误,该参数会导致对整个字节大小限制的命令过长(同样,隐含或使用-s <byteCount+1>指定)。

    • GNU xargs-x没有-n 表示错误 (自v4起)。 2.2),如Armali's hepful answer中所发掘的那样。
    • BSD 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示例:

  • 指定一系列2个参数(如果可用)(如果可能) -x)或必须对每个命令实例使用( with -x):-n 2
  • 将每个命令限制为不超过8(9 - 1)个字节:-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可能会提供解释。