export LC_ALL=C export LANG=C if [ $UID -eq 0 ]; then echo "execscript: the test suite should not be run as root" >&2 fi set -- one two three echo before exec1.sub: "$@" echo calling exec1.sub ./exec1.sub aa bb cc dd ee echo after exec1.sub with args: $? ./exec1.sub echo after exec1.sub without args: $? echo after exec1.sub: "$@" # set up a fixed path so we know notthere will not be found PATH=/usr/bin:/bin:/usr/local/bin: export PATH notthere echo $? # this is iffy, since the error messages may vary from system to system # and /tmp might not exist ln -s ${THIS_SH} /tmp/bash 2>/dev/null if [ -f /tmp/bash ]; then /tmp/bash notthere else ${THIS_SH} notthere fi echo $? rm -f /tmp/bash # /bin/sh should be there on all systems ${THIS_SH} /bin/sh echo $? # try executing a directory / echo $? ${THIS_SH} / echo $? # try sourcing a directory . / echo $? # try sourcing a binary file -- post-2.04 versions don't do the binary file # check, and will probably fail with `command not found', or status 127 # bash-4.1 and later check for 256 NUL characters and fail as binary files # if there are more than that, it's probably binary . ${THIS_SH} 2>/dev/null echo $? # post-bash-2.05 versions allow sourcing non-regular files . /dev/null echo $? # kill two birds with one test -- test out the BASH_ENV code echo echo this is bashenv > $TMPDIR/bashenv export BASH_ENV=$TMPDIR/bashenv ${THIS_SH} ./exec3.sub rm -f $TMPDIR/bashenv unset BASH_ENV # we're resetting the $PATH to empty, so this should be last PATH= notthere echo $? command notthere echo $? command -p notthere echo $? # but -p should guarantee that we find all the standard utilities, even # with an empty or unset $PATH command -p sh -c 'echo this is $0' unset PATH command -p sh -c 'echo this is $0' # a bug in bash before bash-2.01 caused PATH to be set to the empty string # when command -p was run with PATH unset echo ${PATH-unset} echo "echo ok" | ${THIS_SH} -t ${THIS_SH} ./exec2.sub echo $? ${THIS_SH} ./exec4.sub # try exec'ing a command that cannot be found in $PATH ${THIS_SH} ./exec5.sub # this was a bug in bash versions before bash-2.04 ${THIS_SH} -c 'cat /dev/null' >&- # checks for proper return values in subshell commands with inverted return # values ${THIS_SH} ./exec6.sub # checks for properly deciding what constitutes an executable file ${THIS_SH} ./exec7.sub ${THIS_SH} -i ${PWD}/exec8.sub ${THIS_SH} ./exec9.sub ${THIS_SH} ./exec10.sub ${THIS_SH} ./exec11.sub true | `echo true` & echo after # Problem with bash at least back to version 3.0 ${THIS_SH} -c 'VAR=0; VAR=1 command exec; exit ${VAR}' # problem with bash through bash-4.1 ( exec /var/empty/nosuch echo bad ) 2>/dev/null [ $? = 127 ] || echo FAIL: bad exit status $? at $LINENO unset FALSE if [ -x /bin/false ]; then FALSE=/bin/false elif [ -x /usr/bin/false ]; then FALSE=/usr/bin/false else FALSE='command false' fi # problem with undoing redirections before running exit trap through bash-4.3 ${THIS_SH} ./exec12.sub false # function ${THIS_SH} ./exec12.sub command false ${THIS_SH} ./exec12.sub $FALSE ${THIS_SH} ./exec12.sub notfound ${THIS_SH} ./exec12.sub syntaxerror ${THIS_SH} ./exec12.sub nosuchcommand # problem with fork optimization in bash-4.4-alpha $THIS_SH -c 'echo a && /bin/echo b && echo c' $THIS_SH -c 'echo A && /bin/echo B' $THIS_SH -c '/bin/echo c && echo d' $THIS_SH -c '/bin/echo c && /bin/echo d && echo e' ${THIS_SH} ./exec13.sub ${THIS_SH} ./exec14.sub