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

6

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

function cd() {
    cd $1
    ls .
}

我本以为这段代码可以工作,但事实证明,对 cd 的调用会指向函数定义,导致无限循环。

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

更新

奇怪的是,这个方法可行。

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

不知道为什么。
2个回答

9
为了在同名函数或其他地方使用内置命令,您可以使用builtin预命令修饰符:
function cd() {
    builtin cd $1
    ls .
}

内置命令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

当然,你仍然可以在别名中使用builtin或者command命令,如果你想要防止使用另一个别名,或者特定使用内置命令或外部命令。例如:
alias echo="command echo"

使用这个二进制echo代替内置的echo。


在bash中,使用command cd命令很好用。但是当我迁移到zsh时,出现了“command not found: cd”的错误。通过参考这篇文章,我将command cd替换为适用于zsh的builtin cd,问题得到了解决。 - young_souvlaki

2
为什么 echo 命令可行是因为你可能开启了 autocd 选项。你可以通过输入 setopt 来检查这一点,以获取选项列表。
然后,目录名称的输出和输出的捕获触发了 autocd 并进入了该目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接