(以下はcat
「すべてのコマンド」に代わるものです$PATH
。)
次の例を考えてみましょう。
% TMP=${:-=cat}
% FOO="blah blah blah $TMP blah blah blah"
% echo $FOO
blah blah blah /bin/cat blah blah blah
${:-=cat}
文字列に直接補間しても同じ効果は得られません。
% FOO="blah blah blah ${:-=cat} blah blah blah"
% echo $FOO
blah blah blah =cat blah blah blah
中間変数を作成せずに以前と同じ最終結果を得る方法はありますか(つまり、最後の文字列の代わりに/bin/cat
使用)。=cat
TMP
(もちろん${:-=cat}
plain-ol 'の代わりに同じ構成を考慮する唯一の理由は、=cat
それを文字列に挿入できるようにしたいからです。うまくいかないことに驚きました...)
答え1
でin形式は、zsh
コマンドが存在し、オプションが設定されている場合は、指定されたコマンドのフルパスに展開される=
特別な拡張演算子です。=word
word
EQUALS
二重引用符内では拡張は行われないため、${:-=cat}
二重引用符内で使用しても効果はありません。
$ TMP="${:-=cat}"
$ print -rl -- $TMP
=cat
これで、目的の同じ目標を達成するためのいくつかのオプションがあります。
周囲に二重引用符を使用しないでください。
$ FOO="blah blah blah "${:-=cat}" blah blah blah"
$ print -rl -- $FOO
blah blah blah /bin/cat blah blah blah
このzsh/parameter
モジュールは、commands
コマンドハッシュテーブルへのアクセスを提供する連想配列を提供する。以下を使用して$commands[name]
コマンドのフルパスを取得できますname
。
$ zmodload zsh/parameter
$ print -rl -- $commands[cat]
/bin/cat
別のオプションは、次のものを使用することです。:c
修飾子:
$ var=cat
$ print -rl -- $var:c
/bin/cat
$ print -rl "foo ${${:-cat}:c} bar"
foo /bin/cat bar
もちろん、標準command -v
コマンドを使用することもできます。
$ print -rl -- "foo $(command -v cat) bar"
foo /bin/cat bar