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
옵션이 있습니다.