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

Zif*_*ong 13 shell zsh

Zsh手册提到选项-a意味着ALL_EXPORT,

ALL_EXPORT (-a, ksh: -a)

  All parameters subsequently defined are automatically exported.  
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ce. 15

local -a,它-a具有与它相同的含义typeset:

-a
名称是指数组参数.可以通过这种方式创建数组参数,但可以不在typeset语句中将其指定.显示时,显示正常和关联数组.


pax*_*blo 14

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

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
Run Code Online (Sandbox Code Playgroud)

并且qq2.zsh:

echo subshell locvar1 is $LOCVAR1
echo subshell locvar2 is $LOCVAR2
Run Code Online (Sandbox Code Playgroud)

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

subshell locvar1 is
subshell locvar2 is 456
locvar1 is
locvar2 is
globvar is 789
Run Code Online (Sandbox Code Playgroud)

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