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 30
5 30
expect 2 40
2 40
expect 5 20
5 20
./func4.sub: line 10: foo: maximum function nesting level exceeded (100)
1
after: f = 100
./func4.sub: line 10: 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 10: foo: maximum function nesting level exceeded (20)
1
after FUNCNEST assign: f = 38
5
