旧バージョンの zsh の zparseopts と連想配列

旧バージョンの zsh の zparseopts と連想配列

zparseopts2つの異なるバージョンの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

-K4.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メーリングリストに連絡することができます。)=

関連情報