我在 WSL2 上的文件中有以下功能.bashrc
:
cd() {
builtin cd "$@" && ls
}
我在 Cygwin 上使用过这个,没有问题多年,它在 WSL2 上运行得也一样好,除了一个问题:我似乎无法cd
在 中使用新别名的内置功能.bashrc
。
如果cd()
是别名而不是函数,我可以使用以下命令对其进行转义:
alias new="\cd .. && echo 'This is a new alias'"
或者
\cd ..
在命令行上。但此覆盖似乎无法cd()
像使用别名那样使用该函数。
是否可以覆盖 Bash 中的函数?
答案1
是的,通过使用builtin cd
。
(外部命令的等效项是command
,例如ls() { command ls ...; }
。)
注意\
适用于别名,因为它们的扩展会发生前反斜杠处理和其他解析步骤,因此 shell 实际上会尝试查找字面上命名的别名\cd
(不存在)。
因此,该技巧不适用于函数,因为它们充当完全正常的命令,并在很晚的阶段得到解决(此时反斜杠处理已经变成\foo
常规foo
)。