Что означает "local -a foo" в zsh? - PullRequest
13 голосов
/ 20 августа 2010

Руководство Zsh упоминает, что опция -a означает ALL_EXPORT,

ALL_EXPORT (-a, ksh: -a)

  All parameters subsequently defined are automatically exported.  

Хотя export делает переменную доступной для подпроцессов, как эта же переменная foo может быть локальной?

Ответы [ 2 ]

14 голосов
/ 20 августа 2010

В local -a значение -a имеет то же значение, что и для typeset:

-a
Имена относятся к параметрам массива.Параметр массива может быть создан таким образом, но он не может быть назначен в операторе typeset.При отображении отображаются как нормальные, так и ассоциативные массивы.

13 голосов
/ 20 августа 2010

Я думаю, что вы можете быть смущены по ряду направлений.

Настройка 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, доступен в под-оболочке, другой - нет.

...