
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
リンクリストを構成する構造にはディレクトリ名のみが保持され、次のエントリへのポインタと文字列へのポインタのみが保存されます。