$+commands[...]の+は何をしますか?

$+commands[...]の+は何をしますか?

ここに別の検索不可能な質問があります。どう説明しますか$+commands[foobar]?私はそれがの変形だと思います$commands[foobar]が、誰が知っていますか? (少なくともzshを使用すると、絶対にわかりません。 )

また、zsh文書やオンラインでこの質問に対する答えを検索する方法を知りたいです。

答え1

この内容は次のように記録されます。zsh 文書のパラメーター拡張セクション:

${+name}
  If name is the name of a set parameter ‘1’ is substituted, otherwise ‘0’
  is substituted.

例:

$ unset foo
$ if (( $+foo )); then echo set; else echo not set; fi
not set
$ foo=1
$ if (( $+foo )); then echo set; else echo not set; fi
set

から返された名前が設定パラメータであることを確認し$+commands[foobar]てください。zsh$commands[foobar]

答え2

変数の拡張に対する答えは${+name}基本的に問題を解決します。

トピックを完成させるために、速度比較に関するいくつかの情報を追加したいと思いました。スタイル命令を使用する理由は、(($+commands[tree]))配列内の命令を見つける方がcommand -v tree速いからですwhich -a tree

❯ export TIMEFMT=$'%U user %S system %P cpu %*E total'

❯ time (for i ({1..100}) if (($+commands[tree])); then echo 1 &>/dev/null; fi)
0.00s user 0.00s system 89% cpu 0.006 total

❯ time (for i ({1..100}) if command -v tree &>/dev/null; then echo 1 &>/dev/null; fi)
0.00s user 0.00s system 95% cpu 0.010 total

❯ time (for i ({1..100}) if which -a tree &>/dev/null; then echo 1 &>/dev/null; fi)
0.01s user 0.01s system 97% cpu 0.021 total

関連情報