| # These should all be safe |
| LC_ALL=C |
| LC_CTYPE=C |
| LC_COLLATE=C |
| LC_MESSAGES=C |
| |
| # these tests should all generate errors |
| |
| # make sure we don't exit prematurely |
| set +e |
| set +o posix |
| |
| # various alias/unalias errors |
| |
| # at some point, this may mean to `export' an alias, like ksh, but |
| # for now it is an error |
| alias -x foo=barz |
| unalias -x fooaha |
| alias hoowah |
| unalias hoowah |
| |
| # the iteration variable must be a valid identifier |
| for 1 in a b c; do echo $1; done |
| |
| # try to rebind a read-only function |
| func() |
| { |
| echo func |
| } |
| readonly -f func |
| # make sure `readonly' and `declare' play well together |
| declare -Fr |
| func() |
| { |
| echo bar |
| } |
| |
| # bad option |
| unset -x func |
| |
| # cannot unset readonly functions or variables |
| unset -f func |
| # or make them not readonly |
| declare -fr func |
| declare -f +r func |
| |
| XPATH=$PATH |
| declare -r XPATH |
| unset -v XPATH |
| |
| # cannot unset invalid identifiers |
| unset /bin/sh |
| |
| # cannot unset function and variable at the same time |
| unset -f -v SHELL |
| |
| # bad option |
| declare -z |
| # cannot declare invalid identifiers |
| declare -- -z |
| declare /bin/sh |
| |
| # this is the syntax used to export functions in the environment, but |
| # it cannot be used with `declare' |
| declare -f func='() { echo "this is func"; }' |
| |
| # bad option to exec -- this should not exit the script |
| exec -i /bin/sh |
| |
| # try to export -f something that is not a function -- this should be |
| # an error, not create an `invisible function' |
| export -f XPATH |
| |
| # this depends on the setting of BREAK_COMPLAINS in config.h.in |
| break |
| continue |
| |
| # this should not exit the shell; it did in versions before 2.01 |
| shift label |
| |
| # other shells do not complain about the extra arguments; maybe someday |
| # we won't either |
| set -- a b c |
| shift $# label |
| # and get rid of the positional parameters |
| shift $# |
| |
| # let without an expression is an error, though maybe it should just return |
| # success |
| let |
| |
| # local outside a function is an error |
| local |
| |
| # logout of a non-login shell is an error |
| logout |
| |
| # try to hash a non-existant command |
| hash notthere |
| |
| # bad option to hash, although it may mean `verbose' at some future point |
| hash -v |
| |
| # turn off hashing, then try to hash something |
| set +o hashall |
| hash -p ${THIS_SH} ${THIS_SH##*/} |
| |
| # bad identifiers to declare/readonly/export |
| export AA[4] |
| readonly AA[4] |
| |
| declare -a AA |
| unset AA[-2] |
| |
| # try to assign to a readonly array |
| declare -r AA |
| AA=( one two three ) |
| |
| # make sure `readonly -n' doesn't turn off readonly status |
| readonly -n AA |
| AA=(one two three) |
| |
| # try to assign a readonly array with bad assignment syntax |
| # NOTE: this works in post-bash-2.05 (at least when I write this) |
| # readonly -a ZZZ=bbb |
| |
| # bad counts to `shift' |
| shopt -s shift_verbose |
| shift $(( $# + 5 )) |
| shift -2 |
| |
| # bad shell options |
| shopt -s no_such_option |
| shopt no_such_option |
| |
| # non-octal digits for umask and other errors |
| umask 09 |
| umask -S u=rwx:g=rwx:o=rx >/dev/null # 002 |
| umask -S u:rwx,g:rwx,o:rx >/dev/null # 002 |
| |
| # at some point, this may mean `invert', but for now it is an error |
| umask -i |
| |
| # bad assignments shouldn't change the umask |
| mask=$(umask) |
| umask g=u |
| mask2=$(umask) |
| if [ "$mask" != "$mask2" ]; then |
| echo "umask errors change process umask" |
| fi |
| |
| # assignment to a readonly variable in environment |
| VAR=4 |
| readonly VAR |
| VAR=7 : |
| |
| # more readonly variable tests |
| declare VAR=88 |
| declare +r VAR |
| |
| declare -p unset |
| |
| # iteration variable in a for statement being readonly |
| for VAR in 1 2 3 ; do echo $VAR; done |
| |
| # parser errors |
| : $( for z in 1 2 3; do ) |
| : $( for z in 1 2 3; done ) |
| |
| # various `cd' errors |
| ( unset HOME ; cd ) |
| ( HOME=/tmp/xyz.bash ; cd ) |
| # errors from cd |
| cd - |
| cd /bin/sh # error - not a directory |
| OLDPWD=/tmp/cd-notthere |
| cd - |
| |
| # various `source/.' errors |
| . |
| source |
| |
| # maybe someday this will work like in rc |
| . -i /dev/tty |
| |
| # make sure that this gives an error rather than setting $1 |
| set -q |
| |
| # enable non-builtins |
| enable sh bash |
| |
| # try to set and unset shell options simultaneously |
| shopt -s -u checkhash |
| |
| # this is an error -- bad timeout spec |
| read -t var < /dev/null |
| |
| # try to read into an invalid identifier |
| read /bin/sh < /dev/null |
| |
| # try to read into a readonly variable |
| read VAR < /dev/null |
| |
| # bad option to readonly/export |
| readonly -x foo |
| |
| # someday these may mean something, but for now they're errors |
| eval -i "echo $-" |
| command -i "echo $-" |
| |
| # this caused a core dump in bash-2.01 (fixed in bash-2.01.1) |
| eval echo \$[/bin/sh + 0] |
| eval echo '$((/bin/sh + 0))' |
| |
| # error to list trap for an unknown signal |
| trap -p NOSIG |
| |
| # maybe someday trap will take a -s argument like kill, but not now |
| trap -p -s NOSIG |
| |
| # we have a ksh-like ERR trap, post-bash-2.05 |
| #trap 'echo [$LINENO] -- error' ERR |
| |
| # can only return from a function or sourced script |
| return 2 |
| |
| # break and continue with arguments <= 0 |
| for z in 1 2 3; do |
| break 0 |
| echo $x |
| done |
| for z in 1 2 3; do |
| continue 0 |
| echo $x |
| done |
| |
| # builtin with non-builtin |
| builtin bash |
| |
| # maybe someday you will be able to use fg/bg when job control is not really |
| # active, but for now they are errors |
| bg |
| fg |
| |
| # argument required |
| kill -s |
| # bad argument |
| kill -S |
| # null argument |
| kill -INT '' |
| # argument required |
| kill -INT |
| |
| # bad shell option names |
| set -o trackall # bash is not ksh |
| |
| # problem with versions through bash-4.2 |
| readonly xx=5 |
| echo $((xx=5)) |
| echo $? |
| |
| ${THIS_SH} ./errors1.sub |
| ${THIS_SH} ./errors2.sub |
| ${THIS_SH} ./errors3.sub |
| |
| # this must be last! |
| # in posix mode, a function name must be a valid identifier |
| # this can't go in posix2.tests, since it causes the shell to exit |
| # immediately |
| set -o posix |
| function !! () { fc -s "$@" ; } |
| set +o posix |
| |
| echo end |