**(bash의 globstar)에 메모리가 부족합니까?

**(bash의 globstar)에 메모리가 부족합니까?

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연결된 목록을 구성하는 구조에는 디렉터리 이름만 유지되고 다음 항목에 대한 포인터와 문자열에 대한 포인터만 저장됩니다.

관련 정보