1da2e3ebdSchin######################################################################## 2da2e3ebdSchin# # 3da2e3ebdSchin# This software is part of the ast package # 4*b30d1939SAndy Fiddaman# Copyright (c) 1982-2011 AT&T Intellectual Property # 5da2e3ebdSchin# and is licensed under the # 6*b30d1939SAndy Fiddaman# Eclipse Public License, Version 1.0 # 77c2fbfb3SApril Chin# by AT&T Intellectual Property # 8da2e3ebdSchin# # 9da2e3ebdSchin# A copy of the License is available at # 10*b30d1939SAndy Fiddaman# http://www.eclipse.org/org/documents/epl-v10.html # 11*b30d1939SAndy Fiddaman# (with md5 checksum b35adb5213ca9657e911e9befb180842) # 12da2e3ebdSchin# # 13da2e3ebdSchin# Information and Software Systems Research # 14da2e3ebdSchin# AT&T Research # 15da2e3ebdSchin# Florham Park NJ # 16da2e3ebdSchin# # 17da2e3ebdSchin# David Korn <dgk@research.att.com> # 18da2e3ebdSchin# # 19da2e3ebdSchin######################################################################## 20da2e3ebdSchin# test the behavior of return and exit with functions 21da2e3ebdSchin 22da2e3ebdSchinfunction err_exit 23da2e3ebdSchin{ 24da2e3ebdSchin print -u2 -n "\t" 25da2e3ebdSchin print -u2 -r ${Command}[$1]: "${@:2}" 26da2e3ebdSchin let Errors+=1 27da2e3ebdSchin} 28da2e3ebdSchinalias err_exit='err_exit $LINENO' 2934f9b3eeSRoland Mainz 30da2e3ebdSchinCommand=${0##*/} 31da2e3ebdSchininteger Errors=0 327c2fbfb3SApril Chin 3334f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 3434f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT 3534f9b3eeSRoland Mainz 367c2fbfb3SApril Chinunset HISTFILE 377c2fbfb3SApril Chin 38da2e3ebdSchinfoo=NOVAL bar=NOVAL 3934f9b3eeSRoland Mainzfile=$tmp/test 40da2e3ebdSchinfunction foo 41da2e3ebdSchin{ 42da2e3ebdSchin typeset foo=NOEXIT 43da2e3ebdSchin trap "foo=EXIT;rm -f $file" EXIT 44da2e3ebdSchin > $file 45da2e3ebdSchin if (( $1 == 0 )) 46da2e3ebdSchin then return $2 47da2e3ebdSchin elif (( $1 == 1 )) 48da2e3ebdSchin then exit $2 49da2e3ebdSchin else bar "$@" 50da2e3ebdSchin fi 51da2e3ebdSchin} 52da2e3ebdSchin 53da2e3ebdSchinfunction bar 54da2e3ebdSchin{ 55da2e3ebdSchin typeset bar=NOEXIT 56da2e3ebdSchin trap 'bar=EXIT' EXIT 57da2e3ebdSchin if (( $1 == 2 )) 58da2e3ebdSchin then return $2 59da2e3ebdSchin elif (( $1 == 3 )) 60da2e3ebdSchin then exit $2 61da2e3ebdSchin fi 62da2e3ebdSchin} 63da2e3ebdSchin 64da2e3ebdSchinfunction funcheck 65da2e3ebdSchin{ 66*b30d1939SAndy Fiddaman [[ $foo == EXIT ]] || err_exit "foo "$@" : exit trap not set" 67da2e3ebdSchin if [[ -f $file ]] 68da2e3ebdSchin then rm -r $file 69da2e3ebdSchin err_exit "foo $@: doesn't remove $file" 70da2e3ebdSchin fi 71da2e3ebdSchin foo=NOVAL bar=NOVAL 72da2e3ebdSchin} 73da2e3ebdSchin 74da2e3ebdSchin(exit 0) || err_exit "exit 0 is not zero" 75da2e3ebdSchin(return 0) || err_exit "return 0 is not zero" 76da2e3ebdSchin(exit) || err_exit "default exit value is not zero" 77da2e3ebdSchin(return) || err_exit "default return value is not zero" 78da2e3ebdSchin(exit 35) 79da2e3ebdSchinret=$? 80da2e3ebdSchinif (( $ret != 35 )) 81da2e3ebdSchinthen err_exit "exit 35 is $ret not 35" 82da2e3ebdSchinfi 83da2e3ebdSchin(return 35) 84da2e3ebdSchinret=$? 85da2e3ebdSchinif (( $ret != 35 )) 86da2e3ebdSchinthen err_exit "return 35 is $ret not 35" 87da2e3ebdSchinfi 88da2e3ebdSchin 89da2e3ebdSchinfoo 0 0 || err_exit "foo 0 0: incorrect return" 90da2e3ebdSchinfuncheck 0 0 91da2e3ebdSchinfoo 0 3 92da2e3ebdSchinret=$? 93da2e3ebdSchinif (( $ret != 3 )) 94da2e3ebdSchinthen err_exit "foo 0 3: return is $ret not 3" 95da2e3ebdSchinfi 96da2e3ebdSchinfuncheck 0 3 97da2e3ebdSchinfoo 2 0 || err_exit "foo 2 0: incorrect return" 98*b30d1939SAndy Fiddaman[[ $bar == EXIT ]] || err_exit "foo 2 0: bar exit trap not set" 99da2e3ebdSchinfuncheck 2 0 100da2e3ebdSchinfoo 2 3 101da2e3ebdSchinret=$? 102da2e3ebdSchinif (( $ret != 3 )) 103da2e3ebdSchinthen err_exit "foo 2 3: return is $ret not 3" 104da2e3ebdSchinfi 105*b30d1939SAndy Fiddaman[[ $bar == EXIT ]] || err_exit "foo 2 3: bar exit trap not set" 106da2e3ebdSchinfuncheck 2 3 107da2e3ebdSchin(foo 3 3) 108da2e3ebdSchinret=$? 109da2e3ebdSchinif (( $ret != 3 )) 110da2e3ebdSchinthen err_exit "foo 3 3: return is $ret not 3" 111da2e3ebdSchinfi 112da2e3ebdSchinfoo=EXIT 113da2e3ebdSchinfuncheck 3 3 114da2e3ebdSchincat > $file <<! 115da2e3ebdSchinreturn 3 116da2e3ebdSchinexit 4 117da2e3ebdSchin! 118da2e3ebdSchin( . $file ) 119da2e3ebdSchinret=$? 120da2e3ebdSchinif (( $ret != 3 )) 121da2e3ebdSchinthen err_exit "return in dot script is $ret should be 3" 122da2e3ebdSchinfi 123da2e3ebdSchinchmod 755 $file 124da2e3ebdSchin( $file ) 125da2e3ebdSchinret=$? 126da2e3ebdSchinif (( $ret != 3 )) 127da2e3ebdSchinthen err_exit "return in script is $ret should be 3" 128da2e3ebdSchinfi 129da2e3ebdSchincat > $file <<! 130da2e3ebdSchin: line 1 13134f9b3eeSRoland Mainz# next line should fail and cause an exit 132da2e3ebdSchin: > / 133da2e3ebdSchinexit 4 134da2e3ebdSchin! 135da2e3ebdSchin( . $file ; exit 5 ) 2> /dev/null 136da2e3ebdSchinret=$? 137da2e3ebdSchinif (( $ret != 1 )) 138da2e3ebdSchinthen err_exit "error in dot script is $ret should be 1" 139da2e3ebdSchinfi 140da2e3ebdSchin( $file; exit 5 ) 2> /dev/null 141da2e3ebdSchinret=$? 142da2e3ebdSchinif (( $ret != 5 )) 143da2e3ebdSchinthen err_exit "error in script is $ret should be 5" 144da2e3ebdSchinfi 145da2e3ebdSchincat > $file <<\! 146da2e3ebdSchinprint -r -- "$0" 147da2e3ebdSchin! 148da2e3ebdSchinx=$( . $file) 149da2e3ebdSchinif [[ $x != $0 ]] 150da2e3ebdSchinthen err_exit "\$0 in a dot script is $x. Should be $0" 151da2e3ebdSchinfi 1527c2fbfb3SApril Chinx=$($SHELL -i --norc 2> /dev/null <<\! 153da2e3ebdSchintypeset -i x=1/0 154da2e3ebdSchinprint hello 155da2e3ebdSchin! 156da2e3ebdSchin) 157da2e3ebdSchinif [[ $x != hello ]] 158da2e3ebdSchinthen err_exit "interactive shell terminates with error in bltin" 159da2e3ebdSchinfi 160da2e3ebdSchinx=$( set -e 161da2e3ebdSchin false 162da2e3ebdSchin print bad 163da2e3ebdSchin ) 164da2e3ebdSchinif [[ $x != '' ]] 165da2e3ebdSchinthen err_exit "set -e doesn't terminate script on error" 166da2e3ebdSchinfi 167da2e3ebdSchinx=$( set -e 168da2e3ebdSchin trap 'exit 0' EXIT 169da2e3ebdSchin false 170da2e3ebdSchin print bad 171da2e3ebdSchin ) 172da2e3ebdSchinif (( $? != 0 )) 173da2e3ebdSchinthen err_exit "exit 0 in trap should doesn't set exit value to 0" 174da2e3ebdSchinfi 175da2e3ebdSchin$SHELL <<\! 176da2e3ebdSchintrap 'exit 8' EXIT 177da2e3ebdSchinexit 1 178da2e3ebdSchin! 179da2e3ebdSchinif (( $? != 8 )) 180da2e3ebdSchinthen err_exit "exit 8 in trap should set exit value to 8" 181da2e3ebdSchinfi 182*b30d1939SAndy Fiddaman 183*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125)) 184