使用 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
形成链接列表的结构中保留目录名称,仅存储指向下一个条目的指针和指向字符串的指针。