新定义的别名在函数内部无效(zsh)

时间:2014-08-27 16:09:42

标签: function alias zsh operator-precedence

我尝试定义然后在zsh中使用函数内部的别名。它不起作用。为什么不呢?我可以解决它吗?

% cat > test
alias_problem () {
  alias hithere="echo Hi there!"
  hithere
}
^D
% source test
% alias_problem
alias_problem:2: command not found: hithere
% hithere
Hi there!
% wtf?
zsh: no matches found: wtf?

理想情况下,运行alias_problem会打印出Hi there!任何人都可以解释发生了什么吗?有没有办法解决它?

背景:我想创建一个可以创建多个别名的函数,然后运行其中一个。像

这样的东西
myfuncA () {
  alias alias1=...
  alias alias2=...
  alias1
}

这样我就可以设置一个包含多个命令的环境。我将有第二个函数将别名切换到另一个集合。

我应该只使用功能吗?有没有理由在zsh中使用别名而不是函数?我想知道发生了什么,只是为了知道将来如何避免它。

谢谢:)

- 彼得

1 个答案:

答案 0 :(得分:1)

在ALIASING下的man zshmisc中提及:

  

有一个常见的别名问题   以下代码:

          alias echobar=’echo bar’; echobar
     

这将打印一条消息,指出无法找到命令echobar。发生这种情况是因为代码扩展时会出现别名   读入;整行都是一次性阅读,所以          当执行echobar时,扩展新定义的别名为时已晚。这通常是shell脚本中的问题,   函数和用'source'或'。'执行的代码。          因此,建议在非交互式代码中使用函数而不是别名。

认为问题是你的函数体被存储为一行(隐含为alias hithere="..."; hithere),因此与上面引用中遇到的情况相同