如何在双引号字符串中插入 ${:-=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而不是=cat在最终字符串中)而不必创建中间变量TMP

(当然,考虑像${:-=cat}而不是 plain-ol'这样的构造的唯一原因=cat是希望能够将其插入字符串中。我惊讶地发现它不起作用......)

答案1

在 中zsh=in 形式是一个特殊的扩展运算符,如果命令存在并且设置了选项,=word则将扩展为指定命令的完整路径。wordEQUALS

该扩展不在双引号内执行,因此${:-=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

相关内容