2010-08-20 11 views
12

manuale Zsh menziona il fatto che l'opzione -a significa ALL_EXPORT,Che cosa significa "local -a foo" in zsh?

ALL_EXPORT (-a, ksh: -a)

All parameters subsequently defined are automatically exported. 

Mentre export rende la variabile disponibile per sotto-processi, il come può la stessa variabile foo essere locale?

risposta

13

Penso che potresti essere confuso su un numero di fronti.

L'impostazione ALL_EXPORT (-a) è per setopt, non local. Per contrassegnare una variabile per l'esportazione con local, si utilizza local -x.

E sei anche confondendo direzioni di propagazione :-)

Definizione di una variabile come locale impedirà la sua durata si estenda al di là della funzione corrente (verso l'esterno o verso l'alto a seconda di come la tua mente pensa).

Ciò non influisce sulla propagazione della variabile ai processi secondari eseguiti all'interno della funzione (verso l'interno o verso il basso).

Ad esempio, considerare i seguenti script 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 

e qq2.zsh:

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

Quando si esegue zsh qq.zsh, l'uscita è:

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

modo da poter vedere che nessuna variabile locale sopravvive al ritorno da la funzione. Tuttavia, l'esportazione automatica delle variabili locali in un processo secondario chiamato all'interno di xyz è diversa. Quello contrassegnato per l'esportazione con local -x è disponibile nella sub-shell, l'altro no.

+0

Grazie per la risposta. Ho testato questo codice. funzione foo { bar -a locale \t bar = 42 \t zsh -c "echo bar è $ bar" } foo .it torna > bar è 42 . Quindi nei sottoprocessi, la variabile 'bar' funziona come una normale variabile globale esportata? –

+0

@Zifei, vedi il mio aggiornamento, è 'local -x' per l'esportazione,' setopt -a' per 'ALLEXPORT' (probabilmente non lo vuoi, è meglio mantenere il namespace il più pulito possibile). – paxdiablo

+0

Che errore ho appena fatto. Grazie, paxdiablo. –

11

In local -a, il -a ha lo stesso significato come per typeset:

-a
il nome indicano parametri array. Un parametro dell'array può essere creato in questo modo, ma non può essere assegnato a l'istruzione typeset. Durante la visualizzazione, vengono mostrati sia gli array normali che gli array associativi .

+0

Questo è quello che volevo davvero sapere. – To1ne