
Estoy confundido por el diferente comportamiento de zparseopts
dos 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 -K
opció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 -K
restablecer opts
sicualquierSe dan opciones, mientras que 5.0.6
solo se reinicia opts[--opt1]
cuando --opt1
se usa (dejando --opt2
o 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).=