
Меня сбивает с толку разное поведение zparseopts
в двух разных версиях zsh. По сути, я пытаюсь задать список значений параметров по умолчанию в ассоциативном массиве и перезаписать эти значения по умолчанию любыми параметрами, указанными в командной строке. Приведенный ниже код хорошо работает для zsh 5.0.6, но ведет себя странно для 4.3.6 — в частности, в zsh 4.3.6 весь мой массив значений по умолчанию перезаписывается, если перезаписывается один ключ.
мойскрипт
typeset -A opts
opts=(
--opt1 a
--opt2 b
)
zparseopts -A opts -K -- -opt1: -opt2:
echo ${(k)opts}
Запуск скрипта
$ 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
-K
Такое поведение сбивает с толку, поскольку в версиях 4.3.6 и 5.0.6 записи для параметра идентичны zparseopts
:
-K С этой опцией массивы, указанные с опциями -a и -A и с формами `=array', остаются неизменными, когда ни одна из спецификаций для них не используется. Это позволяет назначать им значения по умолчанию перед вызовом zparseopts.
решение1
Замените последнюю строку вашего скрипта на echo ${(kv)opts}
. Запуск с 4.3.6 и 5.0.6 должен показать, что 4.3.6 интерпретирует -K
сброс opts
, еслилюбойпараметры указаны, а 5.0.6
сбрасывается только opts[--opt1]
при --opt1
использовании (оставляя --opt2
любую другую запись в покое).
(Обратите внимание, что это, похоже, изменилось где-то между версиями 5.0.2 и 5.0.6; вы можете спросить об этом в списке рассылки zsh-workers, чтобы подтвердить это.)=