foo
私はいくつかの元の関数をオーバーライドし、実行中にその元の関数(またはそのコピー)を呼び出す関数を参照するために「オーバーライドラッパー」という表現を使用します。
これについてStack Exchangeスレッドを見つけました(例:これ)が、私の場合は、元のファイルfoo
と上書きされたファイルの両方を介してfoo
アクセスFPATH
して自動ロードできる必要があるという追加の要件があります。 (上書きされたバージョンが検索順序の前半に表示され、元のバージョンを隠すことができます。)
これを行う方法はありますか?
FWIW、私が作業している特定のシナリオでは、オーバーライドはfoo
ソースによって参照されるいくつかのグローバル変数にいくつかの非標準値を割り当てることによってアクションを実行します。
ベストアンサー1
autoload
この関数を使用すると、ファイル名が関数名と一致する必要があるという制限なく、thisと同じ方法でファイルから関数コードをロードできます。
## load_from FILE FUNCTION_NAME
load_from () {
eval "$2 () { $(<$1) }"
}
ラッパーコードは以下の通りです。$^fpath/somefunction(N)
定義されたロードパスのリストに展開されます(すべてのエントリのリストに展開され、glob修飾子は既存のファイルに拡張を制限します)。これは、単一レイヤーラッパーとラッパーがある場合にのみ機能します。somefunction
$^fpath/somefunction
/dir/somefunction
/dir
$fpath
(N)
はいfパスから。
#autoload somefunction
local some_parameter=overridden_value
local autoload_files
autoload_files=($^fpath/somefunction(N))
load_from $autoload_files[2] somefunction_wrapped
somefunction_wrapped "$@"