二重引用符で囲まれた文字列に ${:-=cat} を挿入するには?

二重引用符で囲まれた文字列に ${:-=cat} を挿入するには?

(以下は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使用)。=catTMP

(もちろん${:-=cat}plain-ol 'の代わりに同じ構成を考慮する唯一の理由は、=catそれを文字列に挿入できるようにしたいからです。うまくいかないことに驚きました...)

答え1

でin形式は、zshコマンドが存在し、オプションが設定されている場合は、指定されたコマンドのフルパスに展開される=特別な拡張演算子です。=wordwordEQUALS

二重引用符内では拡張は行われないため、${:-=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

関連情報