为什么 `${$(pwd)}` 在 zsh 中输出当前工作目录?

为什么 `${$(pwd)}` 在 zsh 中输出当前工作目录?

在 zsh 中,${$(pwd)}输出当前目录。但是,如果我运行echo ${/path/to/somewhere},它只会显示一个空行。为什么会这样?谢谢!

答案1

我想您会谈论print ${$(pwd)}或类似的事情,对吧?!

扩展 ${$(pwd)}到当前工作目录是预期的行为,尽管乍一看可能看起来很奇怪。不要误以为命令替换$(pwd)首先被评估,然后结果被用作变量名...不,它被用作变量值 解释如下man zshexpn

${name} 如果有的话,将替换参数名称的值。

(...)如果使用${...}类型参数表达式或$(...)类型命令替换代替name上述内容,则首先对其进行扩展,然后将结果用作值name。 (...)with 形式$(...)通常与接下来描述的标志结合使用;请参见下面的示例。

(...) 标志 f 可用于逐行拆分双引号替换。例如,${(f)"$(<file)"}替换文件的内容,以便每行都是结果数组的一个元素。

对于你的第二个例子。我认为这是模式替换语法:

${name/pattern/repl} 用字符串替换参数名称扩展中模式的最长可能匹配。(...)

首先看这个例子:

$ foo=hello
$ print ${foo/hello/good/bye}
good/bye

如果省略,foo则告诉zsh在变量中进行搜索和替换${},该变量为空:

$ print ${}

$

——因此${/something/foo/bar}也返回一个空字符串。

相关内容