由于我喜欢使用描述性的参数名称,因此我经常尝试使用Zsh本身已经使用的变量名称。
过去让我陷入困境,现在我将脚本包装在以该脚本命名的 main 函数中。然后,我使用local
关键字声明所有本地参数。
但是某些参数似乎不允许将它们隐藏在本地范围内:
function foo
{
local commands=(bar baz)
local status=0
echo ${(F)commands}
echo $status
}
在这里,使用本地commands
参数代替特殊参数。
但是由于status
参数是只读的,因此出现以下错误:
zdm:6:只读变量:状态
我认为local
关键字允许在局部范围内使用特殊参数,但它不会改变其声明方式。
答案 0 :(得分:1)
要在本地范围内使用特殊的参数名称,必须使用内置的-h
的{{1}}标志,显式隐藏它:
typeset
当您想将其声明为本地时,请使用也支持该标志的typeset -h status
关键字:
local
您还可以使用local -h status
模块中的private
关键字:
zsh/param/private
zmodload zsh/param/private
private -h status
标志从Zsh手册中:
-h
隐藏:仅对特殊参数(在“ Shell设置的参数”中的表中标记为
-h
的那些参数)和与特殊参数同名的局部参数(尽管对其他参数无害)有用。具有此属性的特殊参数在设为本地时不会保留其特殊效果。因此,在
<S>
之后,包含typeset -h PATH
的函数将创建一个普通的局部参数,而没有PATH的通常行为。或者,本地参数本身可以被赋予该属性;因此,在函数
typeset PATH
中会创建一个普通的局部参数,而特殊的PATH参数不会以任何方式更改。还可以使用
typeset -h PATH
创建一个局部参数,其中special的本地副本将保留其特殊属性,而不管其是否具有-h属性。从外壳模块(当前是zsh / mapfile和zsh / parameter中的模块)加载的全局特殊参数会自动赋予
typeset +h special
属性,以避免名称冲突。
有关更容易理解的解释,请参见Zsh手册页中的local parameters。