전체 인수 배열의 총 크기에 환경의 크기를 더한 것만 큼 단일 인수의 최대 길이가 문제가되지 않았다는 인상을 받았습니다 ARG_MAX
. 따라서 다음과 같은 것이 성공할 것이라고 생각했습니다.
env_size=$(cat /proc/$$/environ | wc -c)
(( arg_size = $(getconf ARG_MAX) - $env_size - 100 ))
/bin/echo $(tr -dc [:alnum:] </dev/urandom | head -c $arg_size) >/dev/null
(가)와 - 100
쉘과의 환경의 크기 사이의 차이보다 충분히 계정 인 echo
방법. 대신 오류가 발생했습니다.
bash: /bin/echo: Argument list too long
잠시 동안 놀아 본 후, 최대 값이 16 진수 크기보다 작다는 것을 알았습니다.
/bin/echo \
$(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \
>/dev/null
빼기 1을 제거하면 오류가 반환됩니다. 겉으로는 하나의 인수에 대한 최대 값은 실제로 ARG_MAX/16
하고는 -1
인수 배열의 문자열의 끝에 배치 널 바이트를 차지한다.
또 다른 문제는 인수가 반복 될 때 인수 배열의 총 크기가 더 가까울 수 ARG_MAX
있지만 여전히 그리 멀지 않다는 것입니다.
args=( $(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) )
for x in {1..14}; do
args+=( ${args[0]} )
done
/bin/echo "${args[@]}" "${args[0]:6534}" >/dev/null
사용 "${args[0]:6533}"
여기하면 마지막 인수 1 바이트 이상하게하고 있습니다 Argument list too long
오류가 발생했습니다. 이 차이는 주어진 환경의 크기에 의해 설명되지 않을 것입니다.
$ cat /proc/$$/environ | wc -c
1045
질문 :
- 이것이 올바른 행동입니까, 아니면 어딘가에 버그가 있습니까?
- 그렇지 않은 경우이 동작이 어디에나 문서화되어 있습니까? 단일 인수의 최대 값을 정의하는 다른 매개 변수가 있습니까?
- 이 동작이 Linux (또는 특정 버전)로 제한됩니까?
- 인수 배열의 실제 최대 크기와 대략적인 환경 크기 사이의 추가 ~ 5KB 불일치가
ARG_MAX
무엇입니까?
추가 정보:
uname -a
Linux graeme-rock 3.13-1-amd64 #1 SMP Debian 3.13.5-1 (2014-03-04) x86_64 GNU/Linux
getconf ARG_MAX
current에 의존합니다 ulimit -s
. 무제한으로 설정하고 ARG_MAX를 위해 놀라운 4611686018427387903을 얻으십시오.