for 루프에서 "인수가 너무 깁니다" 오류가 발생하지 않는 이유는 무엇입니까?

for 루프에서 "인수가 너무 깁니다" 오류가 발생하지 않는 이유는 무엇입니까?

이 경우 "매개변수가 너무 김" 오류가 발생하는 것으로 나타났습니다.

ls *.*

이렇게 해도 개선되지 않습니다.

for file in *.*
do
    echo $file
done

왜?

답변1

"매개변수가 너무 깁니다" 오류는 E2BIG다음으로 인해 발생합니다 .execve인수(일부 시스템의 환경 포함)의 전체 크기가 너무 큰 경우 시스템 호출입니다. 이 execve호출은 외부 프로세스를 시작하는 호출로, 특히 다른 실행 파일을 로드합니다(다른 호출이 있습니다.fork, 코드가 여전히 동일한 실행 파일에서 나오는 별도의 프로세스를 실행하는 경우). 루프 for는 내부 ​​쉘 구성이므로 호출을 포함하지 않습니다 . glob이 확장될 때 오류가 발생하는 대신 execve명령이 호출될 때 오류가 발생합니다.ls *.*ls

execveE2BIG명령 매개변수의 전체 크기가 다음보다 큰 경우ARG_MAX 한계. 명령을 사용하여 시스템에서 이 제한 값을 볼 수 있습니다 getconf ARG_MAX. (메모리가 충분하면 이 제한을 초과할 수 있습니다. 관련 없는 오류가 발생하지 않는 한 ARG_MAX작동이 보장됩니다.)execve

답변2

첫 번째 예에서는 / pair 시스템 호출을 통해 수행되는 ls것 같지만 두 번째 예에서는 모든 작업이 .bashforkexecbash

호출에는 exec제한이 있지만 Python의 내부 작동에는 제한이 없습니다(또는 더 나은 방법은 bash사용 가능한 메모리 양과 관련이 없는 다른 제한이 있습니다).exec

답변3

그 경우에는 ls매개변수이고 매개변수의 수가 제한되어 있기 때문입니다.

루프의 경우에는 for항목 목록일 뿐입니다. (내가 아는 한) 이에 대한 제한은 없습니다.

관련 정보