Parameters 在函数中使用与特殊参数同名的局部参数

Parameters 在函数中使用与特殊参数同名的局部参数,parameters,zsh,Parameters,Zsh,由于我喜欢使用描述性参数名,所以我经常尝试使用Zsh本身已经使用过的变量名 由于它在过去给我带来了麻烦,我现在将脚本包装在一个以脚本命名的主函数中。然后我使用local关键字声明所有本地参数 但有些参数似乎不允许在本地范围内隐藏它们: 函数foo { 本地命令=(baz栏) 本地状态=0 echo${(F)命令} echo$状态 } 这里,使用本地命令参数代替特殊参数 但是由于status参数是只读的,我得到了以下错误: zdm:6:只读变量:状态 我认为local关键字允许在本地范围内使用特

由于我喜欢使用描述性参数名,所以我经常尝试使用Zsh本身已经使用过的变量名

由于它在过去给我带来了麻烦,我现在将脚本包装在一个以脚本命名的主函数中。然后我使用
local
关键字声明所有本地参数

但有些参数似乎不允许在本地范围内隐藏它们:

函数foo
{
本地命令=(baz栏)
本地状态=0
echo${(F)命令}
echo$状态
}
这里,使用本地
命令
参数代替特殊参数

但是由于
status
参数是只读的,我得到了以下错误:

zdm:6:只读变量:状态


我认为
local
关键字允许在本地范围内使用特殊参数,但不会改变其声明方式。

要在本地范围内使用特殊参数名称,必须使用
字体的
-h
标志显式隐藏它

排版-h状态
要将其声明为本地,请使用也支持该标志的
local
关键字:

local-h状态
您还可以使用
zsh/param/private
模块中的
private
关键字:

zmodload zsh/param/private
私人-h身份
-h
标志 从Zsh手册:

-h

隐藏:仅适用于特殊参数(在Shell设置的参数表中标记为
的参数),以及与特殊参数同名的本地参数,但对其他参数无害

具有此属性的特殊参数在局部设置时将不会保留其特殊效果。因此,在
typeset-h PATH
之后,包含
typeset PATH
的函数将创建一个普通的局部参数,而不具有PATH的常规行为

或者,局部参数本身可以被赋予该属性;因此,在函数
typeset中-h PATH
创建一个普通的局部参数,并且特殊的PATH参数不会以任何方式改变

还可以使用
typeset+h special
创建本地参数,其中special的本地副本将保留其特殊属性,而不管是否具有-h属性

从shell模块加载的全局特殊参数(当前在zsh/mapfile和zsh/parameter中)会自动赋予
-h
属性,以避免名称冲突

局部参数 有关更易于理解的解释,请参阅Zsh手册页面中关于