zshの「options」配列を使用したdeclare / typesetの奇妙な動作

ニック・ボリンキン

optionszshのスクリプトで指定された変数を宣言しようとしましたそれは予約された名前であり、zshはその下に連想配列を格納していることが判明しました。

function mcve() {
    options='';
}

$ mcve
mcve:1: options: attempt to set slice of associative array

その内容を見てみたところdeclare、奇妙な振る舞いに遭遇しました。上記のエラーが最初に発生する前と後では、出力が異なります。

$ zsh
$ declare options
options

$ zsh
$ mcve
mcve:1: options: attempt to set slice of associative array
$ declare options
options=(autolist on printexitvalue off...<20 more lines>)

何が起こっていますか?なぜ出力が違うのですか?されたoptions配列は、それを使用する最初の試みの瞬間で宣言しますか?

代わりにそれtypesetを使用する必要があると聞きましたdeclareが、man zshbuiltins完全に等しいと言います。

また、これは失敗することなく実行されます。

function mcve() {
declare options;
options='';
echo ok;
}

$ zsh
$ mcve
ok

なぜこれが違うのですか?

チェプナー

options連想配列は、に記載されてman zshmodules下に、ZSH/PARAMETERSの動作を説明することはできませんがdeclare optionsprint $options[@]declare options表示されない場合でもオン/オフ値のリストが出力されることに注意してください

最後の例でdeclare optionsは、同じ名前のグローバルがすでに存在するかどうかに関係なく、関数定義内で常に新しいローカル変数を宣言します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事