
Estou confuso com o comportamento diferente de zparseopts
duas 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 -K
opçã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 -K
para redefinir opts
sequalqueropções são fornecidas, enquanto 5.0.6
apenas redefine opts[--opt1]
quando --opt1
é usado (deixando --opt2
ou 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.) =