eval 字符串中的 ZSH 别名定义和扩展

Rob*_*ith 1 alias zsh eval

我在学习 ZSH 的过程中遇到了好奇心,并且我很难找到与此相关的信息。我想知道为什么这不起作用的技术解释(定义然后在单个 eval 调用中扩展别名):

eval "alias d='echo hello'; d"

zsh: command not found: d
Run Code Online (Sandbox Code Playgroud)

而这确实有效:

eval "function d = { echo hello; }; d"

hello
Run Code Online (Sandbox Code Playgroud)

Ada*_*hon 5

eval与该问题无关。刚刚打电话

alias d='echo hello'; d
Run Code Online (Sandbox Code Playgroud)

也不行。

原因在于 zsh 解析命令行的方式。在zsh 尝试执行命令行之前,命令行中的所有别名都会被替换。在此示例中,当别名被替换时,zsh 不知道别名d,因此 zsh 在查找命令时显示为空d

另一方面,带有该函数的示例是有效的,因为 zsh 在尝试运行命令之前会查找命令名称指向的位置。d因此,首先定义函数,当 zsh 遇到命令时d,它会查找匹配的函数(或内置或外部命令)并找到先前定义的函数。