
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
4.3.6과 5.0.6에는 다음 -K
옵션 에 대한 동일한 항목이 있기 때문에 이 동작은 혼란스럽습니다.zparseopts
-K 이 옵션을 사용하면 -a 및 -A 옵션과 '=array' 형식으로 지정된 배열은 해당 사양이 사용되지 않을 때 변경되지 않고 유지됩니다. 이를 통해 zparseopts를 호출하기 전에 기본값을 할당할 수 있습니다.
답변1
스크립트의 마지막 줄을 echo ${(kv)opts}
. 4.3.6 및 5.0.6으로 실행하면 4.3.6이 -K
재설정으로 해석되는 것으로 표시됩니다.opts
4.3.6 및 5.0.6을 사용하여 실행하면 4.3.6이 다음 과 같은 경우어느옵션이 제공되지만 을 사용할 때만 5.0.6
재설정됩니다 (떠나 거나 다른 항목만 사용).opts[--opt1]
--opt1
--opt2
(5.0.2와 5.0.6 사이에서 언젠가 변경되는 것으로 나타났습니다. 확인을 위해 zsh-workers 메일링 리스트에 문의할 수 있습니다.)=