Heute habe ich festgestellt, dass eine meiner zsh-Funktionen nicht funktioniert. Ich habe das Problem untersucht und der Schuldige war folgender:
for i in a b
do
echo "$i"
done
0
0
Dann habe ich ein neues zsh eröffnet und dabei funktionierten die Dinge normal:
for i in a b
do
echo "$i"
done
a
b
Kann mir jemand den Grund erklären, warum sich der erste komisch verhält?
i
zuvor im ersten Fall als Ganzzahl gesetzt (oder deklariert)?i
zuweirdName13
und es in der Tat das Problem behoben. Aber ich hatte nichts mit mir gemacht. Wie kann man diesen Satz rückgängig machen? Und wie kann ich meine Skripte schützen, wenn ich als Ganzzahl gesetzt bin?Antworten:
Variablen in
zsh
können verschiedene Typen zugewiesen werden, oben-i
für "intern als Ganzzahl darstellen", wodurch die Variable als solche dargestellt wird. Dies kann auch über erfolgeninteger i
. Es gibt verschiedene Möglichkeiten, um zu überprüfen, was eine Variable ist:Und die übliche Shell
+
zu deaktivieren (siehe auchset -x
,set +x
) es:Es kann nützlich sein, herauszufinden, was den Typ dieser Variablen geändert hat, und diese Änderung auf einen lokalen Bereich (innerhalb einer Funktion) zu beschränken, damit der globale Namespace nicht mit zufälligen Typen verschmutzt wird, insbesondere bei häufig verwendeten wegwerfbaren Variablennamen wie z
i
. Es ist ziemlich einfach, den globalen Namespace zu verschmutzen, da lediglich eine Zuweisung zu einer nicht deklarierten Variablen erforderlich ist:Oder jemand könnte das
-g
Flag unnötig zu einem hinzufügentypeset
, wodurch die Variable global wird:Exportierte Variablen bleiben möglicherweise in neuen Prozessen erhalten (ein untergeordnetes Nicht-Subshell-Via
fork
oder ein Ersatz-Viaexec
), jedoch nicht der Typ:quelle
.
,source
,eval
) in einen bestehenden Prozess dann könnte schlechter Code leicht verschmutzt die Umwelt, wobei in diesem Fall müssen Sie entweder das nicht tun, oder jede Zeile des Random - Code überprüfen , um zu sehen , was es tutunset var
dazu bringen, besondere Eigenschaften zu verlieren. Nun, es sei denn, es ist auch schreibgeschützt. In diesem Fall müssten Sie estypeset +r var
zuerst tun . Bash und ksh könnten dasselbe Problem mit Variablen haben, die als Ganzzahlen festgelegt sind, mit derselben Lösung. Außer dass Sie darin keineunset
schreibgeschützten Variablen finden können.unset
mehrmals , falls es (in denen lokale in mehreren Vorfahren Kontexten erklärt wurde (undyash
,unset
ungesetzt nicht, schält sie aus einer Schicht auslocal
(außer in ,bash
wenn die Variable wurde im aktuellen Kontext deklariert )).export
ist für die Übertragung von skalaren Variablen über Execs, das ist unabhängig von Prozessen.