
Mich verwirrt das unterschiedliche Verhalten zparseopts
in 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 -K
Option 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 -K
als Reset interpretiert wird opts
, wennbeliebigOptionen werden angegeben, während 5.0.6
nur zurückgesetzt wird opts[--opt1]
, wenn --opt1
verwendet wird (Verlassen --opt2
oder 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.)=