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
.
与函数不同 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
当然,你仍然可以在别名中使用builtin
或command
,如果你想防止使用另一个别名,或者如果你想专门使用内置或外部命令。例如:
alias echo="command echo"
有了这个,二进制 echo
将被使用而不是内置的。
我使用 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
.
与函数不同 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
当然,你仍然可以在别名中使用builtin
或command
,如果你想防止使用另一个别名,或者如果你想专门使用内置或外部命令。例如:
alias echo="command echo"
有了这个,二进制 echo
将被使用而不是内置的。