zparseopts com array associativo na versão mais antiga do zsh

zparseopts com array associativo na versão mais antiga do zsh

Estou confuso com o comportamento diferente de zparseoptsduas versões diferentes do zsh. Basicamente, estou tentando definir uma lista de valores de opções padrão em uma matriz associativa e substituir esses padrões por quaisquer opções especificadas na linha de comando. O código abaixo funciona bem para o zsh 5.0.6, mas se comporta de maneira estranha para o 4.3.6 - especificamente, no zsh 4.3.6, todo o meu conjunto de padrões é substituído se uma única chave for substituída.

meuscript

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

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

Executando o script

$ 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 comportamento é confuso porque 4.3.6 e 5.0.6 possuem entradas idênticas para a -Kopção de zparseopts:

-K Com esta opção, os arrays especificados com as opções -a e -A e com os formulários `=array' são mantidos inalterados quando nenhuma das especificações para eles é usada. Isso permite a atribuição de valores padrão a eles antes de chamar zparseopts.

Responder1

Substitua a última linha do seu script por echo ${(kv)opts}. Executar com 4.3.6 e 5.0.6 deve mostrar que 4.3.6 interpreta -Kpara redefinir optssequalqueropções são fornecidas, enquanto 5.0.6apenas redefine opts[--opt1]quando --opt1é usado (deixando --opt2ou qualquer outra entrada sozinha).

(Observe que isso pareceu mudar em algum momento entre 5.0.2 e 5.0.6; você pode querer perguntar na lista de discussão zsh-workers para confirmar.) =

informação relacionada