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
# 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.
-(export FOO=BAR ; exec -c printenv ) | grep FOO
+# 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
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
-. ./source.sub1
-AVAR=foo . ./source.sub1
+. ./source1.sub
+AVAR=foo . ./source1.sub
-. ./source.sub2
+. ./source2.sub
echo $?
set -- a b c
-. ./source.sub3
+. ./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 "$@"
-. ./source.sub3 x y z
+. ./source3.sub x y z
echo "$@"
# but if the sourced script sets the positional parameters explicitly, they
# find the script
echo "$@"
shopt -u sourcepath
-. source.sub4
+. source4.sub
echo "$@"
# this is complicated when the sourced scripts gets its own positional
# parameters from arguments to `.'
set -- a b c
echo "$@"
-. source.sub4 x y z
+. source4.sub x y z
echo "$@"
# test out cd and $CDPATH
-${THIS_SH} ./builtins.sub1
+${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
# 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 . ./source.sub1
+AVAR=foo . ./source1.sub
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
-set +o posix
sigone=$(kill -l | sed -n 's:^ 1) *\([^ ]*\)[ ].*$:\1:p')
case "$(kill -l 1)" in
*) 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
# kill -l NAME should return the signal number
kill -l ${sigone/SIG/}
+
+# test behavior of shopt xpg_echo
+${THIS_SH} ./builtins2.sub
+
+# this must be last -- it is a fatal error
+exit status
+
+echo after bad exit