我使用zsh并希望稍微扩展内置的cd
函数。
当我打电话给cd
时,它会直接更改,然后列出目录的内容。
function cd() {
cd $1
ls .
}
我原本希望这段代码能够正常工作,但事实证明,对cd
的调用是指函数定义,导致无限循环。
除了为我的功能选择不同的名称外,还有解决这个问题的解决办法吗?
更新
奇怪的是,这很有效。
function cd() {
`echo $1`
ls .
}
不知道为什么。
答案 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
当然,如果您想要阻止使用其他别名,或者您想要专门使用内置命令或外部命令,您仍然可以在别名中使用builtin
或command
。例如:
alias echo="command echo"
使用二进制文件echo
代替内置文件。
答案 1 :(得分:2)
为什么echo
命令有效是因为您可能有autocd
选项。您可以通过输入setopt
来查看选项列表来查看。
然后回显目录名并捕获输出触发了autocd,你就到了那个目录。