Bashループは正確にどのように機能しますか?

Bashループは正確にどのように機能しますか?
for i in {0..999999999}; do echo "hi"; done

echoすべてのsが最初に実行され、次に送信されるかのように出力を作成するのに時間がかかりますstdoutcowfortune代わりに使用すると、より顕著な効果があり、echo端末バッファリングが問題になる可能性が減少します。

それでは、上記のコマンドを段階的に実行すると、正確に何が起こりますか?なぜ遅れるのですか?

ベストアンサー1

通常のforループは常に静的文字列のセットを繰り返します。文字列が中かっこ拡張やファイル名グロービングパターン、その他の変数拡張、コマンド置換などによって生成されるかどうかは重要ではありません。

ループの場合は、中for括弧拡張を使用して繰り返す文字列を生成できます。中括弧拡張は、ループの最初の反復が実行される前に完了する必要があります。非常に大きな単語リスト(各単語は0〜999999999の範囲の10億の整数)を生成するため、時間がかかる可能性があります(8 GB以上のRAMが必要な場合があります)。

でこの種の反復を実際に実行する必要がある場合は、代わりにbash算術forループを使用してください。

for (( i=0; i <= 999999999; ++i )); do echo hi; done

...または特定の問題を解決します。

yes hi | head -n 1000000000

...または、現在の作業にほとんどすべての他の言語を使用することを検討してください。シェルスクリプト言語はそのような操作にはほとんど効果がないからです。

おすすめ記事