매우 긴 환경 변수를 설정하면 많은 명령이 중단됩니다.

매우 긴 환경 변수를 설정하면 많은 명령이 중단됩니다.

환경 변수를 조작할 때 이상한 동작을 발견했습니다. 어떤 명령도 실행되지 않도록 하는 매우 긴 환경 변수를 설정하고 있습니다.

( 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시스템 호출. 전부는 아니지만 대부분의 Unix 변형에는 이 임시 공간의 크기에 제한이 있습니다. 이렇게 제한하는 이유는 버그가 있거나 악의적인 프로그램으로 인해 커널이 프로그램 자체 메모리 공간 외부의 많은 양의 메모리를 사용하는 것을 방지하기 위한 것입니다.

이것POSIX 표준이 메모리 공간의 최대 크기가 최소한이어야 함을 지정합니다 ARG_MAX.최소값그 중 ( _POSIX_ARG_MAX)는 4096명이다. 실제로 대부분의 Unix 변형은 이보다 더 많은 것을 허용하지만 10MB는 허용하지 않습니다. 를 사용하여 시스템의 값을 확인할 수 있습니다 getconf ARG_MAX. 최신 Linux 시스템에서 최대값은 2MB입니다(일반 설정 사용). 전통적으로 많은 시스템에는 128kB 제한이 있습니다. 리눅스에도 하나가 있다단일 매개변수 값 또는 환경 변수 정의에 대한 제한은 128kB입니다..

수백 바이트가 넘는 정보를 전달해야 하는 경우 해당 정보를 파일로 전달하세요.

관련 정보