unix shell globbing绑定

时间:2011-07-07 02:48:32

标签: bash unix shell

如果我有一个类似

的do循环
for file in *txt; do {something on $file that results in another file ending with txt being created}; done

这会导致无限循环吗?我很害怕测试它。

2 个答案:

答案 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时间和进程缓冲区以进行测试。