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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.