この質問はフォークですこの問題。
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コマンドを実行し、標準出力全体をキャプチャします。