假设我有这个 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"
}
您可以添加一些检查或创建一个通用函数来复制任意函数,但这应该足以让您解决您所描述的问题......