与えられたファイルm.sh
:
f() {
echo foo
}
g() {
f | sed -r 's/^|$/:/g' # random work
}
そしてe.sh
:
. m.sh
old_f="$(type f | sed '3,$!d')"
f() {
echo "$(eval "$old_f")bar"
}
g
他の関数の参照がまだ有効であるように同じ名前を維持しながら、オーバーライドされた関数で以前の関数を使用してtype
呼び出すよりも優れた解決策はありますか?eval
どちらも同じプロジェクトの一部なので、m.sh
心配せずに修正できます。e.sh
m.sh
答え1
急にこんなことができると思いました。
f_1() {
echo foo
}
f() { f_1 "$@"; }
g() {
f | sed -r 's/^|$/:/g' # random work
}
. m.sh
f_2() {
echo "$(f_1)bar"
}
f() { f_2 "$@"; }
g
残念ながら、これらの定型句を追加するには修正が必要ですが、最小限のm.sh
使用を避けることができます。type
eval
f()
最初の定義を使用して一度定義すると、数値を増やすために手動で上書きすることを回避できます。
f() {
"$(last_version_of_function "${FUNCNAME[0]}")" "$@"
}
次の定義を使用して:
reverse_identifier_words() {
awk -F_ '
BEGIN {
OFS="_"
}
{
for (i = 1; i <= NF / 2; i++) {
t = $i
$i = $(NF - i + 1)
$(NF - i + 1) = t
}
print
}
'
}
last_version_of_function() {
declare -F \
| grep -Eo "\b${1}_[0-9]+\$" \
| reverse_identifier_words \
| sort -rn -t_ -k1 \
| head -n1 \
| reverse_identifier_words
}
この方法でe.sh
上書きするには、次の手順を実行します。
. m.sh
f_2() {
echo "$(f_1)bar"
}
g