이 링크를 보고 질문드립니다"매개변수 목록이 너무 깁니다" 오류가 발생하는 방법은 무엇입니까?
스레드에서 다음 명령을 실행하면 동일한 오류가 표시됩니다.
>/bin/echo `perl -e 'print "x" x 1000000'`
/bin/echo: Argument list too long.
echo
하지만 대신 사용하면 /bin/echo
ARG_MAX를 초과해도 오류가 발생하지 않습니다.
>echo `perl -e 'print "x" x 100000000'`
xxxxxxxxxxx...
이게 내 환경이야
>which echo; getconf ARG_MAX
/bin/echo
2097152
저는 tcsh를 사용하고 있습니다.
답변1
차이점은 echo
쉘의 내장 파일인 반면 /bin/echo
외부 실행 파일이라는 점입니다.
ARG_MAX는 외부 바이너리(execve(2)
.)
셸에서 내장 함수를 실행할 때 시스템은 그러한 제한을 적용하지 않고 셸 자체의 제한만 적용하며 대부분의 셸은 인수를 저장하는 데 사용할 수 있는 메모리 외에는 제한을 적용하지 않습니다.
그런데 이 경우 external 을 수행할 때 /bin/echo
실제로 도달한 제한은 ARG_MAX_STRLEN이며, 이는 ARG_MAX_STRLEN입니다.하나의매개변수이며 Intel 기반 Linux에서는 131,072바이트로 하드코딩됩니다. 바라보다이 답변자세한 내용은. ARG_MAX는 여전히 모든 매개변수(환경 변수 등 포함)에 대한 제한이지만 각 개별 매개변수는 ARG_MAX_STRLEN에 의해 제한됩니다. 따라서 더 짧은 문자열(예: 132,000자)을 생성하기 위해 Perl 표현식을 단축하더라도 여전히 이 특정 제한에 도달해야 합니다.