환경 변수를 망칠 때 이상한 동작이 나타났습니다. 매우 긴 환경 변수를 설정 중인데 이로 인해 어떤 명령도 실행되지 않습니다.
( Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-66-generic x86_64) )
$ export A=$(python -c "print 'a'*10000000")
$ env
-bash: /usr/bin/env: Argument list too long
$ ls
-bash: /bin/ls: Argument list too long
$ cat .bashrc
-bash: /bin/cat: Argument list too long
$ id
-bash: /usr/bin/id: Argument list too long
여기서 무슨 일이 일어나고 있는 걸까요?
답변1
인수 목록과 명령 환경은 프로그램이 시작될 때 메모리의 동일한 공간에 복사됩니다. 오류 메시지는 "인수 목록이 너무 깁니다"이지만 실제로 정확한 오류는 인수 목록과 환경을 더한 값이 너무 길다는 것입니다.
이는 다음의 일부로 발생합니다.execve
시스템 호출. 모든 유닉스 변형은 아니지만 대부분은 이 임시 공간의 크기에 제한이 있습니다. 이러한 제한을 두는 이유는 버그가 있거나 악의적인 프로그램으로 인해 커널이 해당 프로그램의 자체 메모리 공간 외부에 있는 엄청난 양의 메모리를 사용하는 것을 방지하기 위한 것입니다.
그만큼POSIX 표준이 메모리 공간의 최대 크기는 최소한이어야 함 ARG_MAX
을 지정합니다.최소값그 중 ( _POSIX_ARG_MAX
)는 4096입니다. 실제로 대부분의 Unix 변형은 그 이상을 허용하지만 10MB는 허용하지 않습니다. 를 사용하여 시스템의 값을 확인할 수 있습니다 getconf ARG_MAX
. 최신 Linux 시스템에서 최대값은 2MB입니다(일반 설정 기준). 전통적으로 많은 시스템에는 128kB 제한이 있었습니다. 리눅스에도 여전히단일 인수 값 또는 환경 변수 정의에 대한 제한은 128kB입니다..
수백 바이트가 넘는 정보를 전달해야 하는 경우 해당 정보를 파일로 전달하세요.