2010-08-20 13 views
12

Zsh Handbuch erwähnt, dass Option -a bedeutet ALL_EXPORT,Was bedeutet "local-a foo" in zsh?

ALL_EXPORT (-a, ksh: -a)

All parameters subsequently defined are automatically exported. 

Während export macht die Variable auf Teilprozesse verfügbar sind, können die, wie die gleiche Variable foo lokal sein?

Antwort

13

Ich denke, Sie könnten an einer Reihe von Fronten verwirrt sein. Die ALL_EXPORT (-a) Einstellung ist für setopt, nicht local. Um eine Variable für den Export mit local zu kennzeichnen, verwenden Sie local -x.

Und Sie sind auch Ausbreitungsrichtungen verwirrend :-)

eine Variable als lokale Definition über die derzeitige Funktion, der sich von seiner gesamten Lebensdauer verhindern (nach außen oder nach oben, je nachdem, wie Ihr Geist denkt).

Dies hat keinen Einfluss auf die Weitergabe der Variablen an Unterprozesse, die innerhalb der Funktion ausgeführt werden (nach innen oder nach unten).

Betrachten wir zum Beispiel die folgenden Skripte 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 

und qq2.zsh:

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

Wenn Sie zsh qq.zsh laufen, der Ausgang ist:

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

so können Sie sehen, dass keine lokale Variable die Rückkehr von überlebt die Funktion. Der automatische Export der lokalen Variablen in einen Teilprozess, der innerhalb von xyz aufgerufen wird, ist jedoch unterschiedlich. Der für den Export mit local -x markierte ist in der Sub-Shell verfügbar, der andere nicht.

+0

Vielen Dank für Ihre Antwort. Ich habe diesen Code getestet. Funktion foo { lokalen -a bar \t bar = 42 \t zsh -c "echo bar ist $ bar" } foo .it liefert> bar 42 ist. Also in den Teilprozessen, Variable 'bar' fungieren als eine normale exportierte globale Variable? –

+0

@ Zifei, sehe mein Update, es ist 'local -x' für den Export,' setopt -a' für 'ALLEXPORT' (wahrscheinlich willst du das nicht, es ist besser, Namespaces so sauber wie möglich zu halten). – paxdiablo

+0

Was für ein Fehler habe ich gerade gemacht. Danke, Paxdiablo. –

11

In local -a hat die -a die gleiche Bedeutung, wie sie für typeset tun:

-a
Die Namen auf Array-Parameter beziehen. Ein Array-Parameter kann auf diese Weise erstellt werden, aber er darf nicht in dem Satzsatz zugewiesen werden. Bei der Anzeige werden sowohl normale als auch assoziative Arrays angezeigt.

+0

Das wollte ich wirklich wissen. – To1ne