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

时间:2016-05-28 11:27:38

标签: shell terminal zsh

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

function cd() {
    cd $1
    ls .
}

我原本希望这段代码能够正常工作,但事实证明,对cd的调用是指函数定义,导致无限循环。

除了为我的功能选择不同的名称外,还有解决这个问题的解决办法吗?

更新

奇怪的是,这很有效。

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

不知道为什么。

2 个答案:

答案 0 :(得分:4)

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

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

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

对于要使用外部命令而不是别名,内置函数或同名函数的情况,可以使用command预命令修饰符。例如:

command echo foobar

这将使用二进制echo(很可能是/bin/echo)而非 zsh&#39> 内置echo

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

% 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代替内置文件。

答案 1 :(得分:2)

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

然后回显目录名并捕获输出触发了autocd,你就到了那个目录。