使用别名覆盖内置命令

Override a builtin command with an alias

我正在尝试创建一个覆盖 cd 命令的别名。这将在 "real" cd.

之前和之后执行脚本

这是我目前的情况:

alias cd="echo before; cd ; echo after"

这会执行 echo beforeecho after command 但是它 总是 改变目录 ~

我该如何解决这个问题?

我也试过 cd(){ echo before; cd ; echo after; } 但是它反复回显 "before"。

I also tried cd(){ echo before; cd ; echo after; } however it repetedly echos "before".

因为它递归调用了你定义的cd。要修复,请使用 builtin 关键字,例如:

cd(){ pwd; builtin cd "$@"; pwd; }

Ps:无论如何,恕我直言,重新定义 shell 内置函数并不是最好的主意。

只是添加到@jm666 的:

要使用函数覆盖非内置函数,请使用 command。例如:

ls() { command ls -l; }

相当于alias ls='ls -l'

command 也适用于内置函数。所以,你的 cd 也可以写成:

cd() { echo before; command cd ""; echo after; }

要绕过函数或别名和 运行 原始命令或内置命令,您可以在开头放置一个 \:

\ls # bypasses the function and executes /bin/ls directly

或使用command本身:

command ls