使用别名覆盖内置命令
Override a builtin command with an alias
我正在尝试创建一个覆盖 cd
命令的别名。这将在 "real" cd
.
之前和之后执行脚本
这是我目前的情况:
alias cd="echo before; cd ; echo after"
这会执行 echo before
和 echo 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
我正在尝试创建一个覆盖 cd
命令的别名。这将在 "real" cd
.
这是我目前的情况:
alias cd="echo before; cd ; echo after"
这会执行 echo before
和 echo 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