在“for f in *”sh 循环中间添加/删除文件时会发生什么?

Pro*_*ner 5 shell bash wildcards for

我在网上找到了一个 for 循环示例。现在我想在我的代码中使用它,但我不确定这个循环是如何运行的

for entry in "$search_dir"/* 
do
  echo "$entry"
done
Run Code Online (Sandbox Code Playgroud)

现在我想问

  1. 它是否在每次迭代中查找 search_dir 并在每次迭代中将 search_dir 中的文件复制到入口变量一个文件中?
  2. 或者我拍摄 search_dir 的所有内容的快照,然后将该快照存储到条目变量中?
  3. 如果有人在循环仍在工作时在 search_dir 中插入某个文件,输出是否有任何变化?

Kus*_*nda 5

当 shell 到达for-statement 时,它将扩展 的值$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
Run Code Online (Sandbox Code Playgroud)

正如 Stéphane 在评论中正确指出的那样,在大多数情况下,这是一个多余的测试。

  • 在任何情况下,文件可能仍然会在 `[ -e ]` 和 `operate` 之间消失,因此额外的检查不一定会添加更多。 (4认同)
  • @unixbeginner,见 https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use (4认同)
  • @unixbeginner 此循环不会处理这些新文件。 (2认同)