zparseopts con matriz asociativa en una versión anterior de zsh

zparseopts con matriz asociativa en una versión anterior de zsh

Estoy confundido por el diferente comportamiento de zparseoptsdos versiones diferentes de zsh. Básicamente, estoy intentando establecer una lista de valores de opciones predeterminados en una matriz asociativa y sobrescribir estos valores predeterminados con cualquier opción especificada en la línea de comando. El siguiente código funciona bien para zsh 5.0.6 pero se comporta de manera extraña para 4.3.6; específicamente, en zsh 4.3.6, toda mi gama de valores predeterminados se sobrescribe si se sobrescribe una sola clave.

mi guión

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

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

Ejecutando el guión

$ 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

Este comportamiento es confuso porque 4.3.6 y 5.0.6 tienen entradas idénticas para la -Kopción zparseopts:

-K Con esta opción, las matrices especificadas con las opciones -a y -A y con las formas `=matriz' se mantienen sin cambios cuando no se utiliza ninguna de sus especificaciones. Esto permite asignarles valores predeterminados antes de llamar a zparseopts.

Respuesta1

Reemplace la última línea de su script con echo ${(kv)opts}. La ejecución con 4.3.6 y 5.0.6 debería mostrar que 4.3.6 interpreta -Krestablecer optssicualquierSe dan opciones, mientras que 5.0.6solo se reinicia opts[--opt1]cuando --opt1se usa (dejando --opt2o cualquier otra entrada en paz).

(Tenga en cuenta que esto pareció cambiar en algún momento entre 5.0.2 y 5.0.6; es posible que desee preguntar en la lista de correo de zsh-workers para confirmar).=

información relacionada