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.c
xargs/xargs.c
GNU xargsにも--show-limits
オプションがあります。