Подтвердить что ты не робот

Что означает "local -a foo" в zsh?

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

ALL_EXPORT (-a, ksh: -a)

  All parameters subsequently defined are automatically exported.  

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

4b9b3361

Ответ 1

Я думаю, вы можете быть смущены на нескольких фронтах.

Значение 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, другой - нет.

Ответ 2

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

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