a returns 5 b returns 4 c returns 3 d returns 2 in e e returned 25 x is 25 ZZ abcde defghi ZZ 5 0 AVAR AVAR foo foo AVAR 5 5 f1 f1 () { ( return 5 ); status=$?; echo $status; return $status } before: try to assign to FUNCNAME outside: FUNCNAME = before: FUNCNAME = func FUNCNAME = func2 after: FUNCNAME = func outside2: FUNCNAME = function zf is a function zf () { echo this is zf } f is a function f () { echo f-x; echo f-y } 1>&2 subshell f is a function f () { echo f-x; echo f-y } 1>&2 f2 is a function f2 () { echo f2-a; function f3 () { echo f3-a; echo f3-b } 1>&2; f3 } subshell f2 is a function f2 () { echo f2-a; function f3 () { echo f3-a; echo f3-b } 1>&2; f3 } f4 is a function f4 () { echo f4-a; function f5 () { echo f5-a; echo f5-b } 1>&2; f5 } 2>&1 subshell f4 is a function f4 () { echo f4-a; function f5 () { echo f5-a; echo f5-b } 1>&2; f5 } 2>&1 testgrp is a function testgrp () { echo testgrp-a; { echo tg-x; echo tg-y } 1>&2; echo testgrp-b } subshell testgrp is a function testgrp () { echo testgrp-a; { echo tg-x; echo tg-y } 1>&2; echo testgrp-b } funca is a function funca () { ( echo func-a ) } funcb is a function funcb () { ( echo func-b ) } funcc is a function funcc () { ( echo func-c ) 2>&1 } func-a func-b func-c foo-bar foo-bar () { : } expect 5 10 5 10 expect 20 20 expect 5 20 5 20 expect 5 20 5 20 expect 2 40 2 40 expect 5 20 5 20 ./func4.sub: line 23: foo: maximum function nesting level exceeded (100) 1 after: f = 100 ./func4.sub: line 23: foo: maximum function nesting level exceeded (100) 1 after: f = 100 7 after FUNCNEST reset: f = 201 7 after FUNCNEST unset: f = 201 ./func4.sub: line 23: foo: maximum function nesting level exceeded (20) 1 after FUNCNEST assign: f = 38 5