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

时间:2014-11-08 09:15:01

标签: eval alias zsh

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

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

zsh: command not found: d

虽然这确实有效:

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

hello

1 个答案:

答案 0 :(得分:4)

eval与此问题无关。只是打电话

alias d='echo hello'; d

也不起作用。

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

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