(下面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
则将扩展为指定命令的完整路径。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