【问题标题】:ZSH: Call in-built function from zsh function that uses the same nameZSH:从使用相同名称的 zsh 函数调用内置函数
【发布时间】:2016-09-26 16:11:34
【问题描述】:

我使用 zsh 并希望稍微扩展内置的 cd 函数。 我希望当我调用cd时,它直接改变,然后列出目录的内容。

function cd() {
    cd $1
    ls .
}

我原以为这段代码可以工作,但事实证明,对cd 的调用引用了函数定义,从而导致了无限循环。

除了为我的函数选择一个不同的名称之外,是否有解决此问题的解决方法?

更新

奇怪的是,这行得通

function cd() {
    `echo $1`
    ls .
}

不知道为什么。

【问题讨论】:

    标签: shell terminal zsh


    【解决方案1】:

    为了在同名函数内或其他任何地方使用内置命令,您可以使用builtin precommand 修饰符:

    function cd() {
        builtin cd $1
        ls .
    }
    

    builtin COMMAND 告诉 zsh 使用名称为 COMMAND 的内置命令,而不是同名的别名、函数或外部命令。如果这样的内置函数不存在,则会打印错误消息。


    如果您想使用外部命令而不是别名、内置命令或同名函数,您可以使用command 前置命令修饰符。例如:

    command echo foobar
    

    这将使用二进制echo(很可能是/bin/echo)而不是zsh的内置echo


    与函数 builtincommand 不同,通常不需要使用别名来防止递归。虽然可以在别名定义中使用别名

    % alias xx="echo x:"
    % alias yy="xx y:"
    % yy foobar
    y: x: foobar
    

    每个别名只会扩展一次。在第二次出现时,别名将不会被扩展,而是会使用函数、内置或外部命令。

    % alias echo="echo echo:"
    % echo foobar
    echo: foobar
    % alias xx="yy x:"
    % alias yy="xx y:"
    % xx foobar
    zsh: command not found: xx
    

    当然,如果您想阻止使用另一个别名,或者如果您想专门使用内置或外部命令,您仍然可以在别名中使用builtincommand。例如:

    alias echo="command echo"
    

    这样,二进制 echo 将被使用而不是内置。

    【讨论】:

    • 在 bash 中,使用 command cd 效果很好。迁移到 zsh 时出现command not found: cd 错误。感谢这篇文章,将command cd 替换为builtin cd 用于zsh。
    【解决方案2】:

    echo 命令起作用的原因是您可能打开了autocd 选项。您可以通过输入 setopt 来查看此选项以获取您的选项列表。

    然后,目录名称的回显和捕获输出触发了 autocd,然后您进入了该目录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多