179 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 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
 | |
| FUNCNAME=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
 | |
| 
 | |
| # FUNCNEST testing
 | |
| ${THIS_SH} ./func4.sub
 | |
| 
 | |
| unset -f myfunction
 | |
| myfunction() {
 | |
|     echo "bad shell function redirection"
 | |
| } >> /dev/null
 | |
| 
 | |
| myfunction
 | |
| myfunction | cat
 | |
| 
 | |
| segv()
 | |
| {
 | |
| 	echo foo | return 5
 | |
| }
 | |
| 
 | |
| segv
 | |
| echo $?
 | |
| 
 | |
| exit 0
 | 
