否。glob在其中扩展的上下文基本上与普通的命令扩展上下文相同,其中处理所有扩展并以不可变的方式保存结果字以进行迭代。用for-in循环没有懒惰的迭代器。当然,扩张可能是副作用的,并且与球体混合在一起,所以他们必须进行热切的评估。这就是为什么find -exec [+;]
仍然如此频繁地推荐使用globstar,因为它可能同时完成任务。
我不能说这个4096问题。我不认为这两者真的可比。 Shell for..in只是扩展单词并重复它们。
相关的常见问题是您是否可以执行诸如预读下一个要分配的值。据我所知,没有任何额外访问单词列表的Bourne-like shell。你必须为此使用数组。基本上所有for..in
的限制都可以通过数组来克服。
这是我为Bash写的一个有趣的懒惰同步发电机。这是非常无用的。
coproc x { while :; do find . -type f -maxdepth 1 -exec sh -c 'read; echo "$1"' -- {} \;; done; };
while :; do
echo 1 >&"${x[1]}"
read -ru "${x[0]}" file
echo "$file"
sleep 1
done
还有一for..in
珍闻并不真正需要做这样一个问题 - 在ksh93的,和bash的git的devel的分支,它可以利用的“控制变量”以有趣的方式。
function f {
nameref x # Chet may decide not to emulate the typeset -n aliases
for x; do
x=hi
done
}
typeset -a arr
f 'arr['{0..3}']'
typeset -p arr # arr=(hi hi hi hi)
每次迭代都将给定对象的引用赋值给x。当然在ksh中可以是任意复杂的数据类型。我想这可能被滥用以某种方式模拟懒惰。不幸的是,这种模式在mksh中似乎不起作用。
编辑忘了自写这个,我发现很多shell实际上优化了for x
语法。我假设至少for x in
是写入时复制,并且仅在循环内使用shift
或set
时才复制位置参数。