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

관련 정보