Bash odpowiednik FUNCNAME w Dash

Odpowiedzi:

3

Z dowolnymi powłokami POSIX:

defun() {
  eval "
    $1() {
      FUNCNAME=$1
      $(cat)
    }
  "
}

defun g <<\}
  printf '%s\n' "$FUNCNAME"
}

g

Zauważ, że nie można wywołać funkcji zdefiniowanej przez defuntreść funkcji zdefiniowanej przez defun.

Cuonglm
źródło
Można zezwolić na zagnieżdżanie, kodując stos wywołań funkcji w FUNCNAMEzmiennej, np. Używając /jako separatora (nie sądzę, aby jakaś powłoka dopuszczała ukośniki w nazwach funkcji). Złapanie wszystkich instrukcji return byłoby jednak trudne, ale zamiast tego można było wykonać funkcje otoki.
Gilles
(ale tak naprawdę, jeśli chcesz ksh, wiesz, gdzie go znaleźć!)
Gilles
@Gilles: Dobra uwaga. Jestem na wakacjach i nie mam czasu na dalsze dochodzenie. Jeśli nie masz nic przeciwko, zrób ulepszenie lub podaj własną odpowiedź.
cuonglm
1
Dziękuję za odpowiedź i głosowałem za nią. Jednak nie zaakceptuję, ponieważ jest to okropne obejście. Wygląda na to, że odpowiedź brzmi „Dash cant do it”
Steven Penny