代码之家  ›  专栏  ›  技术社区  ›  Ole Tange

xargs'-x选项的作用示例

  •  4
  • Ole Tange  · 技术社区  · 14 年前

    xargs

    但是 参数代换 -x 是否设置。我无法举例说明 -十 有任何影响。

    -十 产生不同的输出。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Dennis Williamson    8 年前

    你必须设置一个大小来测试你是否超过了它。

    $ 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
    
        2
  •  1
  •   Armali    8 年前

    我仍然无法解释为什么这会产生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' (很可能就是你所拥有的)正是有这样的行为,违反了最少惊讶的原则:它通过反复读取下一个输入项并将其附加到现有的命令行,在内存中累积一个命令行,直到它不适合现在的行长,它检查读取的项是否甚至不能作为单个参数放入一行中(对于 echo 1234111 在你的例子中):

          if (p >= endbuf)
            {
              exec_if_possible ();
              error (EXIT_FAILURE, 0, _("argument line too long"));
            }
    

    read_line() 在findutils-4.6.0/xargs/xargs.c中,在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);
    }
    

    这是你的选择 -十 (对应于 bc_ctl.exit_if_size_exceeded -十 , exec_if_possible() return bc_do_exec() 把已经积累的条理清晰的命令( echo 10 11 在你的例子中)。之后 是的,功能 error() 程序。

    我有点期待12-15在其中一个。

    参数代换 总是 退出如果输入项本身太长,则以下所有项都将丢失。

        3
  •  0
  •   Community TheSoundDefense    7 年前

    热释光;博士

    • -x 只有在 -n <argumentCount> : <argumentCount> 参数,如果可用, 必须 适合于单个命令行 -s <byteCount+1> 期权;如果没有, xargs 退出时出错。
      没有 ,命令行 较少的 参数将被构造,并且不会发生错误-除非甚至没有 论点合拍——见下一点。

      • 请注意 -十 含蓄地 适用于 -L <lineCount> -I <placeHolder>
      • 警告 :从OSX 10.11.3和PC-BSD 10.1开始 -十 -n 破碎的 参数代换
    • 没有 -十 实施 单一的 参数,该参数将导致针对总字节大小限制的命令太长(同样,暗示或指定为 -s<字节数+1> ).

      • : -不 缺陷 (从v4.2.2开始),如 Armali's hepful answer .
      • 参数代换 -十 没有 语法上不支持
      • 一个简单的例子,展示了两种实现,即使没有 -十 ,单个过长的参数会导致错误:
        • $ 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公司 参数代换 示例:

    • 指定连续的两个参数(如果可用), 应该 ( 没有 -十 )或者 被使用( 具有 -十 )对于每个命令实例: -n 2
    • -s 9

    注:带 BSD公司 ,的 -十 例子 参数代换 OSX 10.11.3和PC-BSD 10.1上的版本:无论何时 -十 <参数计数> 价值 被忽略并且 表现得好像 -n 1

    # NO -x: Use 2 arguments *if possible*.
    $ echo -e "1 2 3 4a 5 6" | xargs -n 2 -s 9  echo
    1 2
    3    # 'echo 3 4a' is more than 8 (9 - 1) bytes -> '3' is used *alone*
    4a   # 'echo 4a 5' also doesn't fit -> '4a' is also used alone.
    5 6
    
    # WITH -x: *Must* use 2 arguments (if available); *fail* otherwise.
    $ echo -e "1 2 3 4a 5 6" | xargs -n 2 -s 9 -x echo
    xargs: argument list too long  # 'echo 3 4a' is too long; cannot use 2 arguments -> error
    1 2
    

    注意错误消息是如何奇怪地打印出来的 之前 最后成功执行的命令;这可能与上面提到的bug有关,所以 Armali's answer