`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関数を呼び出し、その逆も同様です。私はこのファイルのcd定義の外にprev_cdを定義したいと思います。

私が利用できる1つの秘密は、cd関数が使用しているファイルを見つけることができることです。

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

コマンドをオーバーライドした場合にcd電話できますかunset -f cd

RVM(Ruby Version Manager)オーバーライドのように見えますcd

CD 14 /ユーザー/alexamil/.rvm/scripts/cd

だから、以前のオーバーライドを台無しにしたくありませんcdcd

答え1

定義本文をcd名前のある新しい関数にコピーできますprev_cddeclare -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"
}

任意の関数を複製するためにいくつかのチェックを追加したり、一般的な関数を生成したりできますが、これは説明する問題を解決するのに十分です。

関連情報