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