ZSH:从使用相同名称的 zsh 函数调用内置函数

ZSH: Call in-built function from zsh function that uses the same name

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

function cd() {
    cd 
    ls .
}

我原以为这段代码可以工作,但结果是,对 cd 的调用引用了函数定义,导致无限循环。

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

更新

奇怪的是,这有效

function cd() {
    `echo `
    ls .
}

不知道为什么。

为什么 echo 命令有效是因为您可能启用了 autocd 选项。您可以通过键入 setopt 来查看您的选项列表。

然后目录名称的回显和捕获输出触发了 autocd 并且你去了那个目录。

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

function cd() {
    builtin cd 
    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 将被使用而不是内置的。