"for f in *" shループ中にファイルを追加/削除するとどうなりますか?

オンラインでforループの例を見つけました。私は私のコードでこれを使いたいのですが、このループがどのように機能するのかわかりません。

for entry in "$search_dir"/* 
do
  echo "$entry"
done

今私は聞きたいです。

  1. 反復ごとにsearch_dirを検索し、search_dirのファイルを各反復ごとに1つの項目変数のファイルにコピーしますか?
  2. それとも、search_dirのすべてのコンテンツのスナップショットを撮ってから、そのスナップショットをアイテム変数に保存しますか?
  3. ループが動作し続けている間、誰かがsearch_dirにいくつかのファイルを挿入すると、出力は変わりますか?

ベストアンサー1

シェルがfor- ステートメントに到達すると、値を展開して$search_dirファイル名のグロービングを実行して、繰り返すディレクトリエントリのリストを生成します。これは一度だけ発生します。ループの内容が$search_dir消えたり、新しいファイル/ディレクトリがディレクトリに追加されても、その変更は適用されません。

ループが名前付きディレクトリエントリで動作している場合は、その$entryエントリがループ内に存在するかどうかをテストできます。特に、ループの実行に長い時間がかかり、次のような理由で絶えず変更される多数のファイルがある場合は、さらにそうです。もう一つ:

for entry in "$search_dir"/*; do
    if [ -e "$entry" ]; then
        # operate on "$entry"
    else
        # handle the case that "$entry" went away
    fi
done

Stéphaneがコメントで正しく指摘したように、これは重複するテストです。最大ケース。

おすすめ記事