da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# This software is part of the ast package #
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# and is licensed under the #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# A copy of the License is available at #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# http://www.opensource.org/licenses/cpl1.0.txt #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Information and Software Systems Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# AT&T Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Florham Park NJ #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# David Korn <dgk@research.att.com> #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# test the behavior of return and exit with functions
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction err_exit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -u2 -n "\t"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -u2 -r ${Command}[$1]: "${@:2}"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin let Errors+=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinalias err_exit='err_exit $LINENO'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinCommand=${0##*/}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger Errors=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap "cd /; rm -rf $tmp" EXIT
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinunset HISTFILE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfoo=NOVAL bar=NOVAL
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfile=$tmp/test
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset foo=NOEXIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trap "foo=EXIT;rm -f $file" EXIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin > $file
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (( $1 == 0 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then return $2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin elif (( $1 == 1 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then exit $2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else bar "$@"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset bar=NOEXIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trap 'bar=EXIT' EXIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (( $1 == 2 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then return $2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin elif (( $1 == 3 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then exit $2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction funcheck
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $foo = EXIT ]] || err_exit "foo "$@" : exit trap not set"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if [[ -f $file ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then rm -r $file
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit "foo $@: doesn't remove $file"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin foo=NOVAL bar=NOVAL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(exit 0) || err_exit "exit 0 is not zero"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(return 0) || err_exit "return 0 is not zero"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(exit) || err_exit "default exit value is not zero"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(return) || err_exit "default return value is not zero"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(exit 35)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $ret != 35 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "exit 35 is $ret not 35"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(return 35)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $ret != 35 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "return 35 is $ret not 35"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfoo 0 0 || err_exit "foo 0 0: incorrect return"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfuncheck 0 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfoo 0 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $ret != 3 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "foo 0 3: return is $ret not 3"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfuncheck 0 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfoo 2 0 || err_exit "foo 2 0: incorrect return"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $bar = EXIT ]] || err_exit "foo 2 0: bar exit trap not set"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfuncheck 2 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfoo 2 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $ret != 3 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "foo 2 3: return is $ret not 3"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $bar = EXIT ]] || err_exit "foo 2 3: bar exit trap not set"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfuncheck 2 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(foo 3 3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $ret != 3 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "foo 3 3: return is $ret not 3"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfoo=EXIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfuncheck 3 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $file <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinreturn 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin( . $file )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $ret != 3 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "return in dot script is $ret should be 3"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchmod 755 $file
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin( $file )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $ret != 3 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "return in script is $ret should be 3"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $file <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin: line 1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# next line should fail and cause an exit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin: > /
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin( . $file ; exit 5 ) 2> /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $ret != 1 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "error in dot script is $ret should be 1"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin( $file; exit 5 ) 2> /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $ret != 5 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "error in script is $ret should be 5"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $file <<\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint -r -- "$0"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=$( . $file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $x != $0 ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "\$0 in a dot script is $x. Should be $0"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinx=$($SHELL -i --norc 2> /dev/null <<\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset -i x=1/0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint hello
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $x != hello ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "interactive shell terminates with error in bltin"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=$( set -e
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin false
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print bad
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $x != '' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "set -e doesn't terminate script on error"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=$( set -e
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trap 'exit 0' EXIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin false
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print bad
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $? != 0 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "exit 0 in trap should doesn't set exit value to 0"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$SHELL <<\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrap 'exit 8' EXIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $? != 8 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "exit 8 in trap should set exit value to 8"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit $((Errors))