for i in {0..999999999}; do echo "hi"; done
echo
すべてのsが最初に実行され、次に送信されるかのように出力を作成するのに時間がかかりますstdout
。cowfortune
代わりに使用すると、より顕著な効果があり、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
...または、現在の作業にほとんどすべての他の言語を使用することを検討してください。シェルスクリプト言語はそのような操作にはほとんど効果がないからです。