bash의 globstar( **
) 연산자를 사용하면 메모리 부족 오류가 발생합니까? 다음과 같은 것을 고려해보세요:
for f in /**/*; do printf '%s\n' "$f"; done
거대한 파일 목록을 생성하는 데 사용 하면 **
목록이 메모리에 맞지 않을 정도로 크다고 가정하면 bash가 중단되거나 이를 처리할 메커니즘이 있습니까?
**
나는 수많은 파일을 실행했지만 아무런 문제도 발견하지 못했다는 것을 알고 있으므로 bash가 생성 중인 목록 중 일부를 저장하기 위해 임시 파일과 같은 것을 사용할 것이라고 가정합니다. 그렇죠? Bash는 **
여러 파일을 처리할 수 있나요? 파일 목록이 메모리 용량을 초과하면 bash가 실패합니까? 실패하지 않으면 어떤 메커니즘을 사용합니까? ? sort
에 의해 생성된 임시 파일과 유사한 것이 있습니까 ?
답변1
예, 가능합니다. 그리고이는 globbing 라이브러리에 명시적으로 명시되어 있습니다.:
/* Have we run out of memory? */
if (lose)
{
tmplink = 0;
/* Here free the strings we have got. */
while (lastlink)
{
/* Since we build the list in reverse order, the first N entries
will be allocated with malloc, if firstmalloc is set, from
lastlink to firstmalloc. */
if (firstmalloc)
{
if (lastlink == firstmalloc)
firstmalloc = 0;
tmplink = lastlink;
}
else
tmplink = 0;
free (lastlink->name);
lastlink = lastlink->next;
FREE (tmplink);
}
/* Don't call QUIT; here; let higher layers deal with it. */
return ((char **)NULL);
}
각 메모리 할당 시도는 실패 여부를 확인하고 lose
실패하면 1로 설정됩니다. 쉘에 메모리가 부족하면 결국 종료됩니다(참조:QUIT
). 특별한 치료는 없으며,예를 들어디스크로 유출하거나 발견된 파일을 처리합니다.
메모리 요구 사항 자체는 작습니다. globval
연결된 목록을 구성하는 구조에는 디렉터리 이름만 유지되고 다음 항목에 대한 포인터와 문자열에 대한 포인터만 저장됩니다.