今天,我注意到我的zsh函数之一无法正常工作。我调查了这个问题,罪魁祸首是:
for i in a b
do
echo "$i"
done
0
0
然后,我打开了一个新的zsh,在此过程中,一切工作正常:
for i in a b
do
echo "$i"
done
a
b
谁能解释第一个对我奇怪的表演背后的原因?
% typeset -i i
% for i in a b; print $i
0
0
zsh
可以为in中的变量分配各种类型,以上-i
为“在内部表示为整数”,这将导致变量被表示为整数。也可以通过来完成此操作integer i
。有多种检查变量是什么的方法:
% print ${(t)i}
integer
% typeset -p i
typeset -i i=0
和通常的+
禁用它的外壳程序(另请参见set -x
,set +x
):
% typeset +i i
% for i in a b; print $i
a
b
找出更改了该变量类型的变量并将其限制在局部范围内(在函数内)可能是有益的,这样全局名称空间就不会受到随机类型的污染,尤其是在经常使用的一次性变量名(例如)上i
。污染全局名称空间非常容易,因为只需要分配一个未声明的变量即可:
% () { local l=42; g=43 }
% print $l
% print $g
43
或者有人可以不必要地将-g
标志添加到,typeset
从而使变量成为全局变量:
% () { typeset -g -i h=42 }
% for h in a b; print $h
0
0
导出的变量可以保留到新进程中(通过可以是非子shell子级fork
,或者可以通过来替代exec
),但不能类型:
% export -i h=42
% print $h ${(t)h}
42 integer-export
% ( print ${(t)h} )
integer-export
% exec zsh -l
% print $h ${(t)h}
42 scalar-export
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句