262 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # tests for miscellaneous builtins not tested elsewhere
 | |
| set +p
 | |
| set +o posix
 | |
| 
 | |
| ulimit -c 0 2>/dev/null
 | |
| 
 | |
| # check that break breaks loops
 | |
| for i in a b c; do echo $i; break; echo bad-$i; done
 | |
| echo end-1
 | |
| for i in a b c; do echo $i; break 1; echo bad-$i; done
 | |
| echo end-2
 | |
| for i in a b c; do
 | |
| 	for j in x y z; do
 | |
| 		echo $i:$j
 | |
| 		break
 | |
| 		echo bad-$i
 | |
| 	done
 | |
| 	echo end-$i
 | |
| done
 | |
| echo end-3
 | |
| 
 | |
| # check that break breaks nested loops
 | |
| for i in a b c; do
 | |
| 	for j in x y z; do
 | |
| 		echo $i:$j
 | |
| 		break 2
 | |
| 		echo bad-$i
 | |
| 	done
 | |
| 	echo end-$i
 | |
| done
 | |
| echo end
 | |
| 
 | |
| # check that continue continues loops
 | |
| for i in a b c; do echo $i; continue; echo bad-$i ; done
 | |
| echo end-1
 | |
| for i in a b c; do echo $i; continue 1; echo bad-$i; done
 | |
| echo end-2
 | |
| for i in a b c; do
 | |
| 	for j in x y z; do
 | |
| 		echo $i:$j
 | |
| 		continue
 | |
| 		echo bad-$i-$j
 | |
| 	done
 | |
| 	echo end-$i
 | |
| done
 | |
| echo end-3
 | |
| 
 | |
| # check that continue breaks out of nested loops
 | |
| for i in a b c; do
 | |
| 	for j in x y z; do
 | |
| 		echo $i:$j
 | |
| 		continue 2
 | |
| 		echo bad-$i-$j
 | |
| 	done
 | |
| 	echo end-$i
 | |
| done
 | |
| echo end
 | |
| 
 | |
| # check that `eval' re-evaluates arguments, but `builtin' and `command' do not
 | |
| AVAR='$BVAR'
 | |
| BVAR=foo
 | |
| 
 | |
| echo $AVAR
 | |
| builtin echo $AVAR
 | |
| command echo $AVAR
 | |
| eval echo \$AVAR
 | |
| eval echo $AVAR
 | |
| 
 | |
| # test out eval with a temp environment
 | |
| AVAR=bar eval echo \$AVAR
 | |
| BVAR=xxx eval echo $AVAR
 | |
| 
 | |
| unset -v AVAR BVAR
 | |
| 
 | |
| # test umask
 | |
| mask=$(umask)
 | |
| umask 022
 | |
| umask
 | |
| umask -S
 | |
| umask -S u=rwx,g=rwx,o=rx >/dev/null # 002
 | |
| umask
 | |
| umask -S
 | |
| umask -p
 | |
| umask -p -S
 | |
| umask 0
 | |
| umask -S
 | |
| umask ${mask}	# restore original mask
 | |
| 
 | |
| # builtin/command without arguments should do nothing.  maybe someday they will
 | |
| builtin
 | |
| command
 | |
| 
 | |
| # test enable
 | |
| enable -ps
 | |
| 
 | |
| enable -aps ; enable -nps
 | |
| 
 | |
| enable -n test
 | |
| case "$(type -t test)" in
 | |
| builtin)	echo oops -- enable -n test failed ;;
 | |
| *)	echo enable -n test worked ;;
 | |
| esac
 | |
| 
 | |
| enable test
 | |
| case "$(type -t test)" in
 | |
| builtin)	echo enable test worked ;;
 | |
| *)	echo oops -- enable test failed ;;
 | |
| esac
 | |
| 
 | |
| # test options to exec
 | |
| (exec -a specialname ${THIS_SH} -c 'echo $0' )
 | |
| (exec -l -a specialname ${THIS_SH} -c 'echo $0' )
 | |
| # test `clean' environment.  if /bin/sh is bash, and the script version of
 | |
| # printenv is run, there will be variables in the environment that bash
 | |
| # sets on startup.  Also test code that prefixes argv[0] with a dash.
 | |
| (export FOO=BAR ; exec -c -l printenv ) | grep FOO
 | |
| (FOO=BAR exec -c printenv ) | grep FOO
 | |
| 
 | |
| (export FOO=BAR ; exec printenv ) | grep FOO
 | |
| (FOO=BAR exec printenv ) | grep FOO
 | |
| 
 | |
| # ok, forget everything about hashed commands
 | |
| hash -r
 | |
| hash
 | |
| 
 | |
| # this had better succeed, since command -p guarantees we will find the
 | |
| # standard utilties
 | |
| command -p hash rm
 | |
| 
 | |
| # check out source/.
 | |
| 
 | |
| # sourcing a zero-length-file had better not be an error
 | |
| rm -f /tmp/zero-length-file
 | |
| cp /dev/null /tmp/zero-length-file
 | |
| . /tmp/zero-length-file
 | |
| echo $?
 | |
| rm /tmp/zero-length-file
 | |
| 
 | |
| AVAR=AVAR
 | |
| 
 | |
| . ./source1.sub
 | |
| AVAR=foo . ./source1.sub
 | |
| 
 | |
| . ./source2.sub
 | |
| echo $?
 | |
| 
 | |
| set -- a b c
 | |
| . ./source3.sub
 | |
| 
 | |
| # make sure source with arguments does not change the shell's positional
 | |
| # parameters, but that the sourced file sees the arguments as its
 | |
| # positional parameters
 | |
| echo "$@"
 | |
| . ./source3.sub x y z
 | |
| echo "$@"
 | |
| 
 | |
| # but if the sourced script sets the positional parameters explicitly, they
 | |
| # should be reflected in the calling shell's positional parameters.  this
 | |
| # also tests one of the shopt options that controls source using $PATH to
 | |
| # find the script
 | |
| echo "$@"
 | |
| shopt -u sourcepath
 | |
| . source4.sub
 | |
| echo "$@"
 | |
| 
 | |
| # this is complicated when the sourced scripts gets its own positional
 | |
| # parameters from arguments to `.'
 | |
| set -- a b c
 | |
| echo "$@"
 | |
| . source4.sub x y z
 | |
| echo "$@"
 | |
| 
 | |
| # test out cd and $CDPATH
 | |
| ${THIS_SH} ./builtins1.sub
 | |
| 
 | |
| # test behavior of `.' when given a non-existant file argument
 | |
| ${THIS_SH} ./source5.sub
 | |
| 
 | |
| # test bugs in sourcing non-regular files, fixed post-bash-3.2
 | |
| ${THIS_SH} ./source6.sub
 | |
| 
 | |
| # test bugs with source called from multiline aliases and other contexts
 | |
| ${THIS_SH} ./source7.sub
 | |
| 
 | |
| # in posix mode, assignment statements preceding special builtins are
 | |
| # reflected in the shell environment.  `.' and `eval' need special-case
 | |
| # code.
 | |
| set -o posix
 | |
| echo $AVAR
 | |
| AVAR=foo . ./source1.sub
 | |
| echo $AVAR
 | |
| 
 | |
| AVAR=AVAR
 | |
| echo $AVAR
 | |
| AVAR=foo eval echo \$AVAR
 | |
| echo $AVAR
 | |
| 
 | |
| AVAR=AVAR
 | |
| echo $AVAR
 | |
| AVAR=foo :
 | |
| echo $AVAR
 | |
| set +o posix
 | |
| 
 | |
| # but assignment statements preceding `export' are always reflected in 
 | |
| # the environment
 | |
| foo="" export foo
 | |
| declare -p foo
 | |
| unset foo
 | |
| 
 | |
| # assignment statements preceding `declare' should be displayed correctly,
 | |
| # but not persist after the command
 | |
| FOO='$$' declare -p FOO
 | |
| declare -p FOO
 | |
| unset FOO
 | |
| 
 | |
| # except for `declare -x', which should be equivalent to `export'
 | |
| FOO='$$' declare -x FOO
 | |
| declare -p FOO
 | |
| unset FOO
 | |
| 
 | |
| # test out kill -l.  bash versions prior to 2.01 did `kill -l num' wrong
 | |
| sigone=$(kill -l | sed -n 's:^ 1) *\([^ 	]*\)[ 	].*$:\1:p')
 | |
| 
 | |
| case "$(kill -l 1)" in
 | |
| ${sigone/SIG/})	echo ok;;
 | |
| *)	echo oops -- kill -l failure;;
 | |
| esac
 | |
| 
 | |
| # kill -l and trap -l should display exactly the same output
 | |
| sigonea=$(trap -l | sed -n 's:^ 1) *\([^ 	]*\)[ 	].*$:\1:p')
 | |
| 
 | |
| if [ "$sigone" != "$sigonea" ]; then
 | |
| 	echo oops -- kill -l and trap -l differ
 | |
| fi
 | |
| 
 | |
| # POSIX.2 says that exit statuses > 128 are mapped to signal names by
 | |
| # subtracting 128 so you can find out what signal killed a process
 | |
| case "$(kill -l $(( 128 + 1)) )" in
 | |
| ${sigone/SIG/})	echo ok;;
 | |
| *)	echo oops -- kill -l 129 failure;;
 | |
| esac
 | |
| 
 | |
| # out-of-range signal numbers should report the argument in the error
 | |
| # message, not 128 less than the argument
 | |
| kill -l 4096
 | |
| 
 | |
| # kill -l NAME should return the signal number
 | |
| kill -l ${sigone/SIG/}
 | |
| 
 | |
| # test behavior of shopt xpg_echo
 | |
| ${THIS_SH} ./builtins2.sub
 | |
| 
 | |
| # test behavior of declare -g
 | |
| ${THIS_SH} ./builtins3.sub
 | |
| 
 | |
| # test behavior of using declare to create variables without assigning values
 | |
| ${THIS_SH} ./builtins4.sub
 | |
| 
 | |
| # this must be last -- it is a fatal error
 | |
| exit status
 | |
| 
 | |
| echo after bad exit
 | 
