多次覆盖 `cd` 或其他内置函数

多次覆盖 `cd` 或其他内置函数

假设我有这个 bash 函数:

cd(){
 builtin cd "$@"
 echo "do my own thing"
}

问题是,如果我cd在另一个地方重写,则仅计算 1 个重写,任何其他重写都将被最新的源函数覆盖!

有没有办法拥有多个cd函数并让它们全部被调用?

我在想这样的事情:

alias prev_cd="cd";

cd(){
   prev_cd  
   echo "do my own thing"
}

但我怀疑这是完全正确的..问题解决prev_cd办法是,这会导致无限循环。其中 prev_cd 调用我的 cd 函数,反之亦然。我只想将 prev_cd 定义为该文件之外的 cd 定义。

我可以使用的一个技巧是我可以使用以下命令找到 cd 函数所在的文件:

shopt -s extdebug
declare -F cd
shopt -u extdebug

如果我已经覆盖了该cd命令,我可以调用unset -f cd?

它看起来像 RVM(Ruby 版本管理器)覆盖cd

cd 14 /Users/alexamil/.rvm/scripts/cd

所以我不想弄乱以前的覆盖cd..所以我只想在cd不弄乱以前的覆盖的情况下覆盖...

答案1

您可以将定义的主体复制cd到具有名称的新函数中prev_cd。使用declare -f cd获取该定义,然后eval重新定义它。

definition_prev_cd="prev_$(declare -f cd)"
eval "${definition_prev_cd}"
unset definition_prev_cd  # clean up, no reason to leave this string around

cd () {
   prev_cd "$@"
   echo "do my own thing"
}

您可以添加一些检查或创建一个通用函数来复制任意函数,但这应该足以让您解决您所描述的问题......

相关内容