a() { x=$((x - 1)) return 5 } b() { x=$((x - 1)) a echo a returns $? return 4 } c() { x=$((x - 1)) b echo b returns $? return 3 } d() { x=$((x - 1)) c echo c returns $? return 2 } e() { d echo d returns $? echo in e x=$((x - 1)) return $x } f() { e echo e returned $? echo x is $x return 0 } x=30 f # make sure unsetting a local variable preserves the `local' attribute f1() { local zz zz=abcde echo $zz unset zz zz=defghi echo $zz } zz=ZZ echo $zz f1 echo $zz unset -f f1 f1() { return 5 } ( f1 ) echo $? unset -f f1 f1() { sleep 5 return 5 } f1 & wait echo $? unset -f f1 f1() { echo $AVAR printenv AVAR } AVAR=AVAR echo $AVAR f1 AVAR=foo f1 echo $AVAR unset -f f1 # make sure subshells can do a `return' if we're executing in a function f1() { ( return 5 ) status=$? echo $status return $status } f1 echo $? declare -F f1 # should print just the name declare -f f1 # should print the definition, too # no functions should be exported, right? declare -xF declare -xf # FUNCNAME tests func2() { echo FUNCNAME = $FUNCNAME } func() { echo before: FUNCNAME = $FUNCNAME func2 echo after: FUNCNAME = $FUNCNAME } echo before: try to assign to FUNCNAME FUCNAME=7 echo outside: FUNCNAME = $FUNCNAME func echo outside2: FUNCNAME = $FUNCNAME # test exported functions (and cached exportstr) zf() { echo this is zf } export -f zf ${THIS_SH} -c 'type -t zf' ${THIS_SH} -c 'type zf' ${THIS_SH} ./func1.sub # tests for functions whose bodies are not group commands, with and without # attached redirections ${THIS_SH} ./func2.sub # test for some posix-specific function behavior ${THIS_SH} ./func3.sub exit 0