Руководство Zsh упоминает, что опция -a
означает ALL_EXPORT
,
ALL_EXPORT (-a, ksh: -a)
Все параметры, определенные впоследствии, автоматически экспортируются.
В то время как export
делает переменную доступной для подпроцессов, каким образом эта же переменная foo
может быть локальной?
Я думаю, вы можете запутаться по ряду вопросов.
Параметр 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
, доступен во вспомогательной оболочке, другой - нет.
В local -a
, -a
имеет то же значение, что и для typeset
:
-a
. Эти имена относятся к параметрам массива. Параметр массива может быть создан таким образом, но он не может быть присвоен в операторе typeset. При выводе на экран отображаются как обычные, так и ассоциативные массивы.