options
zshのスクリプトで指定された変数を宣言しようとしました。それは予約された名前であり、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 options
、何print $options[@]
もdeclare options
表示されない場合でもオン/オフ値のリストが出力されることに注意してください。
最後の例でdeclare options
は、同じ名前のグローバルがすでに存在するかどうかに関係なく、関数定義内で常に新しいローカル変数を宣言します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加