Warum schlägt die Zuweisung von lokalen ZSH-Variablen fehl?

3

Ich habe diese Frage und Antwort gelesen: zsh - Variablenzuweisung funktioniert nicht . Der Beitrag erklärt, wie man das Problem behebt, aber nicht warum. Warum schlägt die Zuweisung der lokalen Variablen in diesem Fall fehl?

Es gibt auch einige andere Beispiele für ähnliches Verhalten wie dieses:

myfun()
{
local x=$(echo "a b"); echo ${x} 
}

myfun2()
{
local x 
x=$(echo "a b")
echo ${x}
}

myfun3()
{
local x=$(echo "a b")
echo ${x}
}

Daraus ergibt sich folgende Ausgabe:

a
a b
a

Wenn ich das 'x = "$ (echo" a b ")" in jedem Fall in Anführungszeichen setze, erhalte ich die richtige Variablenzuordnung.

Wenn ich dasselbe in bash ausführe, bekomme ich 'ab' für alle Funktionen.

Kann jemand erklären, warum sich bash und zsh hier unterschiedlich verhalten?

Theooze
quelle

Antworten:

1

Wenn Sie Ihr Skript mit -x(beiden bashund zsh) ausführen, werden Sie feststellen, dass der Code $ (...) unterschiedlich interpretiert / analysiert wird. Dies liegt daran, dass, wie in den FAQ angegeben , die Wortteilung in zsh rückwärts / bash / sh inkompatibel ist.

Mit können Sie SH_WORD_SPLITdiesen Unterschied beheben.

Ok, es handelt sich also nicht um ein Worttrennungsproblem, da wir eine Befehlsersetzung haben, in der die Dokumente erneut zitiert werden:

... Wenn die Ersetzung nicht in doppelte Anführungszeichen eingeschlossen ist, wird die Ausgabe mit dem IFSParameter in Wörter zerlegt ...

Ihre Alternative ist also local IFS="": /

Felipe Lema
quelle
das scheint nicht zu funktionieren: zsh -x test.sh +test.sh:1> setopt shwordsplit +test.sh:21> myfun +myfun:2> echo 'a b' +myfun:2> local 'x=a' b +myfun:2> echo a
Theooze