Com quaisquer shells POSIX:
defun() {
eval "
$1() {
FUNCNAME=$1
$(cat)
}
"
}
defun g <<\}
printf '%s\n' "$FUNCNAME"
}
g
Note que você não pode chamar uma função definida por defun
dentro do corpo de uma função definida por defun
.