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

T. *_*Rex 4 shell terminal zsh

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

function cd() {
    cd $1
    ls .
}
Run Code Online (Sandbox Code Playgroud)

我曾希望此代码能够正常工作,但事实证明,对的调用cd引用了函数定义,从而导致了无限循环。

除了为我的函数选择其他名称之外,是否有解决方法来解决此问题?

更新

奇怪的是,这工作

function cd() {
    `echo $1`
    ls .
}
Run Code Online (Sandbox Code Playgroud)

不知道为什么。

Ada*_*hon 5

为了从具有相同名称的函数中或其他任何地方使用内置命令,可以使用builtinprecommand修饰符:

function cd() {
    builtin cd $1
    ls .
}
Run Code Online (Sandbox Code Playgroud)

builtin COMMAND告诉zsh使用具有名称的内置COMMAND函数,而不是具有相同名称的别名,函数或外部命令。如果不存在这样的内置文件,则会显示一条错误消息。


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

command echo foobar
Run Code Online (Sandbox Code Playgroud)

这将使用二进制文件echo(最有可能/bin/echo)而不是zsh的 Builtin echo


不像功能builtincommand通常不必使用别名,以防止递归。虽然可以在别名定义中使用别名

% alias xx="echo x:"
% alias yy="xx y:"
% yy foobar
y: x: foobar
Run Code Online (Sandbox Code Playgroud)

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

% alias echo="echo echo:"
% echo foobar
echo: foobar
% alias xx="yy x:"
% alias yy="xx y:"
% xx foobar
zsh: command not found: xx
Run Code Online (Sandbox Code Playgroud)

当然,如果要阻止使用其他别名,或者要专门使用内置命令或外部命令,则仍然可以使用builtincommand别名。例如:

alias echo="command echo"
Run Code Online (Sandbox Code Playgroud)

这样,echo将使用二进制文件代替内置文件。