
zsh 完成関数では、次の if 文が発生します。
if _cache_invalid my_data || ( [[ ${+_my_array_var} -eq 0 ]] && ! _retrieve_cache my_data ) ; then ...
アイデアは、キャッシュが無効な場合はifブロックを入力することです。それ以外の場合は設定されていることを確認し、そうで_my_array_var
ない場合はキャッシュから検索してみてください。設定せずにキャッシュ検索に失敗すると、_my_array_var
ifブロックも入力されます。デバッグに関する限り、if文のロジックは問題ありませんが、変数がキャッシュから_my_array_var
正常に取得されると、if文の後半は変数を埋めません。
短いテストでは、かっこを非難したことがわかりました
echo ${+_my_array_var}
if [[ ${+_my_array_var} -eq 0 ]] && !_retrieve_cache my_data; then echo "entered" ; fi
echo ${+_my_array_var}
これは0
当時の状況を反映しています1
(つまり_my_array_var
、設定されていない場合はキャッシュ検索が機能してから設定さ_my_array_var
れます。)
echo ${+_my_array_var}
if ( [[ ${+_my_array_var} -eq 0 ]] && !_retrieve_cache my_data ); then echo "entered" ; fi
echo ${+_my_array_var}
これは0
2回エコーされます。つまり、ifブロックはまだ入力されていませんが、人口は_my_array_var
ifテストを「残していません」ということです。
したがって、元のコードでは括弧を削除する必要があるようですが、式の階層や段落の動作を変更せずにこれを実行したいと思います。
かっこを使用せずに関連性を||
設定する方法は?&&
答え1
すべてのBourne様シェルでは、like内の括弧はzsh
サブシェルの実行を表します。
コマンドをグループ化するには、次のようにします。{ ...; }
コマンドグループ代わりに:
if
_cache_invalid my_data || {
(( $+_my_array_var == 0 )) &&
! _retrieve_cache my_data
}
then ...
または:
if
_cache_invalid my_data || ! {
(($+_my_array_var )) || _retrieve_cache my_data
}
then ...
バラよりinfo zsh subshell
詳細:
( LIST )
サブシェルでLISTを実行します。 LIST が実行されると、組み込みトラップによって設定されたトラップがデフォルト値にリセットされます。
{ LIST }
実行リスト。