2010-08-20 7 views
12

manuel zsh mentionne cette option -a signifie ALL_EXPORT,Que signifie "local -a foo" dans zsh?

ALL_EXPORT (-a, ksh: -a)

All parameters subsequently defined are automatically exported. 

Alors que export rend la variable à la disposition des sous-processus, la façon dont la même variable foo peut être locale?

Répondre

13

Je pense que vous pourriez être confus sur un certain nombre de fronts. Le paramètre ALL_EXPORT (-a) est défini sur setopt, et non sur local. Pour marquer une variable pour l'exportation avec local, vous utilisez local -x.

Et vous aussi confus directions de propagation :-)

Définition d'une variable locale empêchera sa durée de vie au-delà de l'extension de la fonction en cours (en fonction vers l'extérieur ou vers le haut sur la façon dont votre esprit pense).

Ceci n'affecte pas la propagation de la variable aux sous-processus exécutés dans la fonction (vers l'intérieur ou vers le bas).

Par exemple, tenez compte des scripts suivants 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 

et qq2.zsh:

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

Lorsque vous exécutez zsh qq.zsh, la sortie est:

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

afin que vous puissiez voir qu'aucune variable locale survit au retour de la fonction. Cependant, l'exportation automatique des variables locales vers un sous-processus appelé xyz est différente. Celui marqué pour l'exportation avec local -x est disponible dans la sous-coque, l'autre ne l'est pas.

+0

Nous vous remercions de votre réponse. J'ai testé ce code. fonction foo { bar -a locale \t bar = 42 \t zsh -c "bar echo est $ bar" } foo .it retourne > bar est 42 . Donc, dans les sous-processus, la variable 'bar' agit comme une variable globale exportée normale? –

+0

@Zifei, voir ma mise à jour, c'est 'local -x' pour l'exportation,' setopt -a' pour 'ALLEXPORT' (vous ne voulez probablement pas cela, il est préférable de garder les espaces de noms aussi propres que possible). – paxdiablo

+0

Quelle erreur je viens de faire. Merci, paxdiablo. –

11

En local -a, le -a a la même signification comme pour typeset:

-a
Les noms se rapportent aux paramètres du tableau. Un paramètre de tableau peut être créé de cette manière, mais il ne peut pas être affecté à l'instruction de composition. Lors de l'affichage, les tableaux associatifs normaux et sont affichés.

+0

C'est ce que je voulais vraiment savoir. – To1ne