zparseopts
2つの異なるバージョンの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メーリングリストに連絡することができます。)=