メモリを襲う

メモリを襲う

この質問はフォークですこの問題

MCVEのバージョンは次のとおりです。

$ PS1='Parent-$ '
Parent-$ type seq
seq is /usr/bin/seq
Parent-$ bash
$ PS1='Child-$ '
Child-$ for i in $(seq 1000000000); do echo $i; done
bash: xrealloc: .././subst.c:5273: cannot allocate 18446744071562067968 bytes (4299235328 bytes allocated)
Parent-$ seq: write error: Broken pipe

(父と息子を簡単に区別するためにPS1を変えました。)

デフォルトでは、子bashは大量のseqコマンドの処理中にメモリ不足エラーが発生します。

問題は、明らかにseqが最初に計算され、出力がforループの入力として使用されるためです。

しかし、私の質問は:なぜ当たらないのですか?MAX_ARG_STRLEN制限?それとも本当に限界に達したのでしょうか?しかし、もしそうなら、bashのOOMは間違ってはいけません...そうですか?

1つの考えられる理由は、bashが最初に計算して$(...)メモリに保存するためです。評価が完了すると、実際のコマンド部分for...のコマンドラインが形成されます。ただし、最初のステップが完了する前に OOM エラーが発生します。

この理解が正しいか教えてください。

ベストアンサー1

MAX_ARG_STRLENは、外部プログラムを呼び出すときにのみ適用されます。 "for"はbash構文の一部であるため、bashはそれを直接処理します。はい、「for」ステートメントを置き換える前にseqコマンドを実行し、標準出力全体をキャプチャします。

おすすめ記事