古いバージョンの zsh での連想配列を使用した zparseopts

古いバージョンの zsh での連想配列を使用した zparseopts

2 つの異なるバージョンの zshの異なる動作に困惑していますzparseopts。基本的に、連想配列にデフォルトのオプション値のリストを設定し、コマンド ラインで指定されたオプションでこれらのデフォルトを上書きしようとしています。以下のコードは、zsh 5.0.6 では正常に動作しますが、4.3.6 では奇妙な動作をします。具体的には、zsh 4.3.6 では、1 つのキーが上書きされると、デフォルトの配列全体が上書きされます。

マイスクリプト

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

スクリプトの最後の行を に置き換えます。4.3.6と5.0.6で実行すると、4.3.6では次の場合にリセットするとecho ${(kv)opts}解釈されます。-Koptsどれでもオプションが指定されていますが、が使用された場合に5.0.6のみリセットされます(または他のエントリをそのままにします)。opts[--opt1]--opt1--opt2

(これは 5.0.2 と 5.0.6 の間で変更されたようです。確認するには、zsh-workers メーリング リストで質問することをお勧めします。)=

関連情報