여기서 무슨 일이 일어나고 있는지 설명할 수 있는 사람이 있습니까?
$ export a
$ a=`perl -e 'print "z"x1000000'`
$ a=`perl -e 'print "z"x1000000'`
bash: /usr/bin/perl: Argument list too long
$ a=`perl -e 'print "z"x1000000'`
$ a=`perl -e 'print "z"x1000000'`
bash: /usr/bin/perl: Argument list too long
(perl one liner는 1,000,000 zs를 포함하는 문자열을 생성합니다). 실행할 때마다 명령줄이 너무 긴 이유는 무엇입니까?
$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
편집하다
실행 실패로 인해 $a가 재설정되는 것 같습니다. 한도는 131070인 것 같습니다. 이 값 아래에는 오류가 없습니다.
답변1
이는 전달되는 인수 및 환경 변수의 크기에 대한 제한입니다.구현하다.
- POSIX를 지정하여
ARG_MAX
. - 2.6.23 이전의 Linux 커널 버전은 32페이지로 제한되었습니다(MAX_ARG_PAGES). 4kB 페이지 크기의 경우 제한은 128kB입니다.
- Linux 커널 2.6.23 이상, 허용되는 스택 크기의 1/4로 제한됩니다.
제한사항도 있으니 참고해주세요execve에 전달되는 문자열의 최대 길이 및 수. 리눅스 소스코드에 하드코딩되어 있으며, 허용되는 스택 크기에 상관없이 적용됩니다.
너는 볼 수있어사람 2가 실행됩니다.자세한 내용은.
두 번째로 실행하면 Perl 프로세스가 시작되지 않으므로 명령 대체는 `perl …`
빈 출력을 생성하고 a
null 값으로 설정되어 환경을 다시 더 작은 크기로 축소합니다. 그런 다음 세 번째 명령이 성공하여 환경을 크기 제한에 가깝게 설정합니다.
더 명확하게 말하면, export a; a=$(yes | head -c128k)
더 이상 외부 명령을 실행할 수 없습니다.