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);

その後、128kに制限してください。bc_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オプションがあります。

関連情報