我简单地查看了 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.c
xargs/xargs.c
GNU xargs 也有一个--show-limits
选项。