我尝试定义然后在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中使用别名而不是函数?我想知道发生了什么,只是为了知道将来如何避免它。
谢谢:)
- 彼得
答案 0 :(得分:1)
在ALIASING下的man zshmisc
中提及:
有一个常见的别名问题 以下代码:
alias echobar=’echo bar’; echobar
这将打印一条消息,指出无法找到命令echobar。发生这种情况是因为代码扩展时会出现别名 读入;整行都是一次性阅读,所以 当执行echobar时,扩展新定义的别名为时已晚。这通常是shell脚本中的问题, 函数和用'source'或'。'执行的代码。 因此,建议在非交互式代码中使用函数而不是别名。
我认为问题是你的函数体被存储为一行(隐含为alias hithere="..."; hithere
),因此与上面引用中遇到的情况相同