zparseopts mit assoziativem Array in älterer Version von zsh

zparseopts mit assoziativem Array in älterer Version von zsh

Mich verwirrt das unterschiedliche Verhalten zparseoptsin zwei verschiedenen Versionen von zsh. Im Grunde versuche ich, eine Liste von Standardoptionswerten in einem assoziativen Array festzulegen und diese Standardwerte mit allen in der Befehlszeile angegebenen Optionen zu überschreiben. Der folgende Code funktioniert gut für zsh 5.0.6, verhält sich aber merkwürdig für 4.3.6 – insbesondere in zsh 4.3.6 wird mein gesamtes Array von Standardwerten überschrieben, wenn ein einzelner Schlüssel überschrieben wird.

meinSkript

typeset -A opts
opts=(
--opt1 a
--opt2 b
)

zparseopts -A opts -K -- -opt1: -opt2:
echo ${(k)opts}

Ausführen des Skripts

$ myscript 
--opt1 --opt2  # both zsh 4.3.6 and 5.0.6

$ myscript --opt1 x
--opt1 --opt2  # zsh 5.0.6; element of array is replaced
--opt1         # zsh 4.3.6; adding an element overwrites the whole array, no more opt2

Dieses Verhalten ist verwirrend, da 4.3.6 und 5.0.6 identische Einträge für die -KOption haben zparseopts:

-K Mit dieser Option bleiben die mit den Optionen -a und -A und mit den Formen `=array' angegebenen Arrays unverändert, wenn keine der Spezifikationen für sie verwendet wird. Dies ermöglicht die Zuweisung von Standardwerten zu ihnen, bevor zparseopts aufgerufen wird.

Antwort1

Ersetzen Sie die letzte Zeile Ihres Skripts durch echo ${(kv)opts}. Die Ausführung mit 4.3.6 und 5.0.6 sollte zeigen, dass 4.3.6 -Kals Reset interpretiert wird opts, wennbeliebigOptionen werden angegeben, während 5.0.6nur zurückgesetzt wird opts[--opt1], wenn --opt1verwendet wird (Verlassen --opt2oder ein anderer Eintrag allein).

(Beachten Sie, dass sich dies anscheinend irgendwann zwischen 5.0.2 und 5.0.6 geändert hat. Zur Bestätigung möchten Sie ggf. auf der Mailingliste der zsh-workers nachfragen.)=

verwandte Informationen