次の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
だから、以前のオーバーライドを台無しにしたくありません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"
}
任意の関数を複製するためにいくつかのチェックを追加したり、一般的な関数を生成したりできますが、これは説明する問題を解決するのに十分です。