2011-07-07 4 views

答えて

4

*.txtの拡張は、通常、コマンドを実行する前にシェルによって実行されます。だから、いいえ、無限ループにはなりません。

「通常は」と言うのは、使用しているシェルに依存するからです。しかし、以下に示すように、私は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ファイルは、最初のループ反復の間に追加されたことに注意しますがは、すべてのループには影響しませんその展開はすでにその時点で行われているためです。

+0

これはCシェルでも同様です。 'foreach i(* .xyzzy)... end'はbashと同じ結果を返します。 – turingtest37

0

ループの内容が処理される前にグロブ展開が行われるため、無限ループは作成されません。

このようなことを試したい場合は、ulimitsをチェックして、控えめなCPU時間とテストするプロセスを設定してください。