**(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。如果 shell 内存不足,它最终会退出(请参阅QUIT)。没有什么特殊处理,例如溢出到磁盘或处理已找到的文件。

内存需求本身很小:仅在globval形成链接列表的结构中保留目录名称,仅存储指向下一个条目的指针和指向字符串的指针。

相关内容