在zsh中,“local -a foo”是什么意思?

时间:2010-08-20 14:10:56

标签: shell zsh

Zsh手册提到选项-a表示ALL_EXPORT

  

ALL_EXPORT (-a, ksh: -a)

  All parameters subsequently defined are automatically exported.  

虽然export使变量可用于子流程,但同一变量foo如何是本地变量?

2 个答案:

答案 0 :(得分:13)

我想你可能会在很多方面感到困惑。

ALL_EXPORT (-a)设置适用于setopt,而非local。要使用local标记要导出的变量,请使用local -x

你也混淆了传播方向: - )

将变量定义为本地将阻止其生命周期超出当前函数(向外或向上取决于您的思维方式)。

这不会影响变量在函数内(内向或向下)运行的子进程的传播。

例如,请考虑以下脚本qq.zsh

function xyz {
    local LOCVAR1
    local -x LOCVAR2
    LOCVAR1=123
    LOCVAR2=456
    GLOBVAR=789
    zsh qq2.zsh
}

xyz
echo locvar1 is $LOCVAR1
echo locvar2 is $LOCVAR2
echo globvar is $GLOBVAR

qq2.zsh

echo subshell locvar1 is $LOCVAR1
echo subshell locvar2 is $LOCVAR2

运行zsh qq.zsh时,输出为:

subshell locvar1 is
subshell locvar2 is 456
locvar1 is
locvar2 is
globvar is 789

所以你可以看到,本地变量都没有从函数返回。但是,将局部变量自动导出到xyz内调用的子进程是不同的。标记为导出local -x的那个在子shell中可用,另一个不在。

答案 1 :(得分:13)

local -a中,-atypeset的含义相同:

  

-a
     名称指的是数组参数。数组参数                        可以这种方式创建,但可能不会分配给                        排版声明。显示时,正常和                        显示了关联数组。