如果我有一个类似
的do循环for file in *txt; do {something on $file that results in another file ending with txt being created}; done
这会导致无限循环吗?我很害怕测试它。
答案 0 :(得分:4)
*.txt
的扩展通常由shell在运行任何命令之前完成。所以,不,它不会导致无限循环。
我说“通常”,因为它当然取决于你正在使用的shell。但是我所拥有的每一个shell都以这种方式工作,包括bash
,如下所示:
pax$ rm -rf *.xyzzy ; touch 1.xyzzy 2.xyzzy ; ls *.xyzzy
1.xyzzy 2.xyzzy
pax$ echo ===== ; for i in *.xyzzy ; do
> echo Processing $i
> echo ..... before touch ; ls *.xyzzy
> touch 3.xyzzy
> echo ..... after touch ; ls *.xyzzy
> echo =====
> done
=====
Processing 1.xyzzy
..... before touch
1.xyzzy 2.xyzzy
..... after touch
1.xyzzy 2.xyzzy 3.xyzzy
=====
Processing 2.xyzzy
..... before touch
1.xyzzy 2.xyzzy 3.xyzzy
..... after touch
1.xyzzy 2.xyzzy 3.xyzzy
=====
pax$ ls *.xyzzy
1.xyzzy 2.xyzzy 3.xyzzy
您会注意到,在第一次循环迭代期间添加的3
文件根本不会影响循环,因为此时已完成扩展。
答案 1 :(得分:0)
没有创建无限循环,因为在处理循环内容之前完成了glob扩展。
如果您想尝试这样的事情,请查看ulimits并设置一个保守的CPU时间和进程缓冲区以进行测试。