######################################################################## # # # This software is part of the ast package # # Copyright (c) 1982-2007 AT&T Intellectual Property # # and is licensed under the # # Common Public License, Version 1.0 # # by AT&T Intellectual Property # # # # A copy of the License is available at # # http://www.opensource.org/licenses/cpl1.0.txt # # (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # # # # Information and Software Systems Research # # AT&T Research # # Florham Park NJ # # # # David Korn # # # ######################################################################## # test the behavior of return and exit with functions function err_exit { print -u2 -n "\t" print -u2 -r ${Command}[$1]: "${@:2}" let Errors+=1 } alias err_exit='err_exit $LINENO' Command=${0##*/} integer Errors=0 foo=NOVAL bar=NOVAL file=/tmp/shtest$$ trap "rm -f $file" EXIT INT function foo { typeset foo=NOEXIT trap "foo=EXIT;rm -f $file" EXIT > $file if (( $1 == 0 )) then return $2 elif (( $1 == 1 )) then exit $2 else bar "$@" fi } function bar { typeset bar=NOEXIT trap 'bar=EXIT' EXIT if (( $1 == 2 )) then return $2 elif (( $1 == 3 )) then exit $2 fi } function funcheck { [[ $foo = EXIT ]] || err_exit "foo "$@" : exit trap not set" if [[ -f $file ]] then rm -r $file err_exit "foo $@: doesn't remove $file" fi foo=NOVAL bar=NOVAL } (exit 0) || err_exit "exit 0 is not zero" (return 0) || err_exit "return 0 is not zero" (exit) || err_exit "default exit value is not zero" (return) || err_exit "default return value is not zero" (exit 35) ret=$? if (( $ret != 35 )) then err_exit "exit 35 is $ret not 35" fi (return 35) ret=$? if (( $ret != 35 )) then err_exit "return 35 is $ret not 35" fi foo 0 0 || err_exit "foo 0 0: incorrect return" funcheck 0 0 foo 0 3 ret=$? if (( $ret != 3 )) then err_exit "foo 0 3: return is $ret not 3" fi funcheck 0 3 foo 2 0 || err_exit "foo 2 0: incorrect return" [[ $bar = EXIT ]] || err_exit "foo 2 0: bar exit trap not set" funcheck 2 0 foo 2 3 ret=$? if (( $ret != 3 )) then err_exit "foo 2 3: return is $ret not 3" fi [[ $bar = EXIT ]] || err_exit "foo 2 3: bar exit trap not set" funcheck 2 3 (foo 3 3) ret=$? if (( $ret != 3 )) then err_exit "foo 3 3: return is $ret not 3" fi foo=EXIT funcheck 3 3 cat > $file < $file < / exit 4 ! ( . $file ; exit 5 ) 2> /dev/null ret=$? if (( $ret != 1 )) then err_exit "error in dot script is $ret should be 1" fi ( $file; exit 5 ) 2> /dev/null ret=$? if (( $ret != 5 )) then err_exit "error in script is $ret should be 5" fi cat > $file <<\! print -r -- "$0" ! x=$( . $file) if [[ $x != $0 ]] then err_exit "\$0 in a dot script is $x. Should be $0" fi x=$($SHELL -i 2> /dev/null <<\! typeset -i x=1/0 print hello ! ) if [[ $x != hello ]] then err_exit "interactive shell terminates with error in bltin" fi x=$( set -e false print bad ) if [[ $x != '' ]] then err_exit "set -e doesn't terminate script on error" fi x=$( set -e trap 'exit 0' EXIT false print bad ) if (( $? != 0 )) then err_exit "exit 0 in trap should doesn't set exit value to 0" fi $SHELL <<\! trap 'exit 8' EXIT exit 1 ! if (( $? != 8 )) then err_exit "exit 8 in trap should set exit value to 8" fi exit $((Errors))