이 질문은 포크입니다이 문제.
MCVE 버전은 다음과 같습니다.
$ PS1='Parent-$ '
Parent-$ type seq
seq is /usr/bin/seq
Parent-$ bash
$ PS1='Child-$ '
Child-$ for i in $(seq 1000000000); do echo $i; done
bash: xrealloc: .././subst.c:5273: cannot allocate 18446744071562067968 bytes (4299235328 bytes allocated)
Parent-$ seq: write error: Broken pipe
(아버지와 아들을 쉽게 구분하기 위해 PS1을 바꿔봤습니다.)
기본적으로 하위 bash는 많은 수의 seq 명령을 처리하는 동안 메모리 부족 오류가 발생합니다.
문제는 분명히 seq가 먼저 계산되고 출력이 for 루프의 입력으로 사용되기 때문입니다.
하지만 내 질문은: 왜 히트하지 않는가?MAX_ARG_STRLEN 한도? 아니면 정말 한계에 도달한 걸까요? 하지만 그렇다면 bash의 OOM이 잘못이 되어서는 안 됩니다... 맞나요?
한 가지 가능한 이유는 bash가 먼저 계산하여 $(...)
메모리에 저장하기 때문입니다. 평가가 완료되면 실제 명령 부분 for...
에 대한 명령줄이 형성됩니다 . 그러나 첫 번째 단계가 완료되기 전에 OOM 오류가 발생합니다.
이 이해가 올바른지 알려주십시오.
답변1
MAX_ARG_STRLEN은 외부 프로그램을 호출할 때만 적용됩니다. "for"는 bash 구문의 일부이므로 bash가 이를 직접 처리합니다. 예, "for" 문을 대체하기 전에 seq 명령을 실행하고 전체 표준 출력을 캡처합니다.