使用别名覆盖内置命令

iPr*_*ram 7 bash shell alias function built-in

我试图创建一个覆盖cd命令的别名.这将在"真实"之前和之后执行脚本cd.

这是我到目前为止:

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

这会执行echo before,echo after command但它总是更改目录~

我该如何解决这个问题?

cd(){ echo before; cd $1; echo after; }然而我也尝试过它"在之前"重复回声.

jm6*_*666 8

cd(){ echo before; cd $1; echo after; }然而我也尝试过它"在之前"重复回声.

因为它以递归方式调用cd您定义的.要修复,请使用以下builtin关键字:

cd(){ pwd; builtin cd "$@"; pwd; }
Run Code Online (Sandbox Code Playgroud)

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


cod*_*ter 7

只是添加到@ jm666 的答案

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

ls() { command ls -l; }
Run Code Online (Sandbox Code Playgroud)

这相当于alias ls='ls -l'.

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

cd() { echo before; command cd "$1"; echo after; }
Run Code Online (Sandbox Code Playgroud)

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

\ls # bypasses the function and executes /bin/ls directly
Run Code Online (Sandbox Code Playgroud)

或使用command本身:

command ls
Run Code Online (Sandbox Code Playgroud)