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.
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? –
@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
Che errore ho appena fatto. Grazie, paxdiablo. –