bashの「継承」(evalなし)オーバーライドされた関数でsuperを呼び出す方法はありますか?

bashの「継承」(evalなし)オーバーライドされた関数でsuperを呼び出す方法はありますか?

与えられたファイル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.shm.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使用を避けることができます。typeeval

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

関連情報