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

时间:2019-01-01 23:57:14

标签: parameters zsh

由于我喜欢使用描述性的参数名称,因此我经常尝试使用Zsh本身已经使用的变量名称。

过去让我陷入困境,现在我将脚本包装在以该脚本命名的 main 函数中。然后,我使用local关键字声明所有本地参数。

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

function foo
{
    local commands=(bar baz)
    local status=0

    echo ${(F)commands}
    echo $status
}

在这里,使用本地commands参数代替特殊参数。

但是由于status参数是只读的,因此出现以下错误:

  

zdm:6:只读变量:状态

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

1 个答案:

答案 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