【问题标题】:Newly defined alias not working inside a function (zsh)新定义的别名在函数内不起作用 (zsh)
【发布时间】:2014-08-27 16:09:41
【问题描述】:

我尝试在 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 中使用别名而不是函数?我想知道发生了什么,只是想知道以后如何避免。

谢谢:)

--彼得

【问题讨论】:

    标签: function alias zsh operator-precedence


    【解决方案1】:

    这在 ALIASING 下的 man zshmisc 中有所提及:

    别名存在一个常见问题 以下代码:

              alias echobar=’echo bar’; echobar
    

    这会打印一条消息,提示找不到命令 echobar。发生这种情况是因为在代码中扩展了别名 读入;一口气读完整行,所以 当执行 echobar 时,扩展新定义的别名为时已晚。这通常是 shell 脚本中的一个问题, 函数,以及使用‘source’或‘.’执行的代码。 因此,建议在非交互式代码中使用函数而不是别名。

    认为问题在于您的函数体存储为单行(隐式为alias hithere="..."; hithere),因此与上述引用中遇到的情况相同。

    【讨论】:

    • 所以你(和 zshmisc)是说如果 echobar 已经定义,那么 ls; echobar; ls 扩展为 ls; echo bar; ls 然后执行?我错过了;谢谢。
    • 对。代码在定义函数时被读取,因此当函数被调用时不会发生别名扩展,尽管别名是为函数调用之后读取的代码定义的。用这个更清楚一点:定义foo () { bar; },然后定义别名alias bar="echo foo"。调用foo仍然会产生command not found错误,因为调用函数时没有对函数体进行别名扩展。
    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多