今天我注意到我的一个 zsh 功能无法运行;我调查了这个问题,罪魁祸首是这样的:
for i in a b
do
echo "$i"
done
0
0
然后我打开一个新的 zsh,一切正常:
for i in a b
do
echo "$i"
done
a
b
谁能解释第一个对我来说表现得很奇怪的原因吗?
答案1
% typeset -i i
% for i in a b; print $i
0
0
中的变量zsh
可以被分配各种类型,上面的-i
“内部表示为整数”,这将导致变量被表示为那样。这也可以通过 来完成integer i
。有多种方法可以检查变量是什么:
% print ${(t)i}
integer
% typeset -p i
typeset -i i=0
+
以及禁用它的常用 shell (另请参阅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
标志添加到 a 中typeset
,使变量成为全局变量:
% () { typeset -g -i h=42 }
% for h in a b; print $h
0
0
导出的变量可能会保留到新进程中(非子 shell 子进程 viafork
或替换 via 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