我在学习ZSH时玩弄好奇心,而且我正在寻找与此相关的难以找到的信息。我想知道为什么这不起作用的技术解释(在单个eval调用中定义然后扩展别名):
eval "alias d='echo hello'; d"
zsh: command not found: d
虽然这确实有效:
eval "function d = { echo hello; }; d"
hello
答案 0 :(得分:4)
eval
与此问题无关。只是打电话
alias d='echo hello'; d
也不起作用。
原因在于zsh解析命令行的方式。在 zsh甚至尝试执行它之前,命令行中的所有别名都被替换为。在此示例中,当替换别名时,zsh不知道别名d
,因此在查找命令d
时zsh会变空。
另一方面,带有该函数的示例有效,因为zsh会在尝试运行它之前查找命令名称所指向的位置。所以首先定义函数d
,当zsh遇到命令d
时,它会查找匹配的函数(或内置或外部命令)并找到先前定义的函数。