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 메일링 리스트에 문의할 수 있습니다.) =