Anmerkung der Redaktion:
Vielleicht ist die folgende, aus den eigenen Antwort genommen der OP, besser veranschaulicht das überraschende Verhalten:
f() { local b=1; g; echo $b; }; g() { b=2; }; f # -> '2'
Ie, g()
konnte die f()
lokale$b
Variable ändern. Variablenzuweisung in Call verschachtelter Funktion ändert unerwartet lokalen Variable im Gültigkeitsbereich des Anrufers
In Zsh und Bash, wenn ich die folgende Funktion f() { a=1; g; echo $a; }
und die folgende Funktion g() { a=2; }
wenn ich f
laufen haben, bekomme ich die folgende Ausgabe statt der erwarteten: Es
$ f
2
Ist Wie auch immer, um diese Variable blutethrough von Funktion zu Funktion zu deaktivieren?
Ich arbeite an einem ziemlich großen und wichtigen Bash/Zsh-Skript bei der Arbeit, die eine Tonne von Variablen in verschiedenen Funktionen verwendet; viele dieser Funktionen hängen von einer größeren Master-Funktion ab, aber wegen der Variablen, die durch ein ziemlich unglückliches und unerwartetes Verhalten bluten, und Bugs sind in den Vordergrund gerückt, was mich daran hindert, die Entwicklung voranzutreiben, da ich dieses seltsame Problem zuerst ansprechen möchte .
Ich habe sogar versucht, mit local
Variablen zu lokalisieren, aber der Effekt tritt immer noch auf.
BEARBEITEN: Beachten Sie, dass meine Frage nicht geht, wie Sie lokale Variablen verwenden, um das Durchlaufen von Variablen zu verhindern oder wie lokale Variablen funktionieren, wie Sie lokale Variablen setzen, wie Sie einer bereits deklarierten lokalen Variablen einen neuen Wert zuweisen. oder irgendwas von diesem Mist: Es geht darum, zu verhindern, dass Variablen in den Bereich von Anrufer/angerufenen Funktionen gelangen.
Mögliches Duplikat [assign lokalen Variable von der Funktion in linux bash einer neuer Wert] (http://stackoverflow.com/questions/22527325/assign-local-variable-von-funktion-in-linux-bash-a-new-value) – Inian
@Inisch, vielleicht, aber meine Frage hat wirklich nichts damit zu tun, einen neuen Wert zu geben eine Variable so sehr wie die alte beibehalten. Ich habe die akzeptierte Antwort und die eigentliche Frage in der von Ihnen verknüpften Frage durchgesehen und sie scheinen mein Problem nicht wirklich anzugehen. –