xargs:建立命令的命令行,直到达到系统定义的限制 - 什么限制?

xargs:建立命令的命令行,直到达到系统定义的限制 - 什么限制?

我简单地查看了 findutils 4.6.0 中 xargs 的源代码,发现 'n' 定义: args_per_exec 但 find utils 中的 args_per_exec 似乎没有默认值

那么‘系统定义的限制’是在哪里定义的呢?

它不重复,因为该问题是作为联机帮助页条目的解释,而不是任意命令长度的通用问题

答案1

限制为sysconf(_SC_ARG_MAX),包括环境字符串和 2048 字节的净空。这是实际字符串的最大长度+分隔空字节,而不是参数的数量。这是来自 GNU xargs'来源:

      /* IEEE Std 1003.1, 2003 specifies that the combined argument and
       * environment list shall not exceed {ARG_MAX}-2048 bytes.  It also
       * specifies that it shall be at least LINE_MAX.
       */
      long val;
#ifdef _SC_ARG_MAX
      val = sysconf (_SC_ARG_MAX);
      if (val > 0)
        {
          assert (val > XARGS_POSIX_HEADROOM);
          /* Note that val can in fact be greater than ARG_MAX
           * and bc_ctl.arg_max can also be greater than ARG_MAX.
           */
          bc_ctl.arg_max = smaller_of (bc_ctl.arg_max,
                                       (size_t)val-XARGS_POSIX_HEADROOM);

然后将其限制为 128kbc_use_sensible_arg_max(),但可以通过以下选项增加-s

void
bc_use_sensible_arg_max (struct buildcmd_control *ctl)
{
#ifdef DEFAULT_ARG_SIZE
  enum { arg_size = DEFAULT_ARG_SIZE };
#else
  enum { arg_size = (128u * 1024u) };
#endif

对于 ,极限计算和钳位都是相同的find -exec ... {} +;上面的代码复制了以下逻辑bc_get_arg_max()bc_init_controlinfo(),后者是通过和headroom的参数 2048 来调用的。find/parser.cxargs/xargs.c

GNU xargs 也有一个--show-limits选项。

相关内容