![xargs:建立命令的命令行,直到达到系统定义的限制 - 什么限制?](https://linux22.com/image/11725/xargs%EF%BC%9A%E5%BB%BA%E7%AB%8B%E5%91%BD%E4%BB%A4%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%EF%BC%8C%E7%9B%B4%E5%88%B0%E8%BE%BE%E5%88%B0%E7%B3%BB%E7%BB%9F%E5%AE%9A%E4%B9%89%E7%9A%84%E9%99%90%E5%88%B6%20-%20%E4%BB%80%E4%B9%88%E9%99%90%E5%88%B6%EF%BC%9F%20.png)
我简单地查看了 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
选项。