1# error-p.tst: test of error conditions for any POSIX-compliant shell 2 3posix="true" 4 5test_O -d -e n 'syntax error kills non-interactive shell' 6fi 7echo not reached 8__IN__ 9 10test_O -d -e n 'syntax error in eval kills non-interactive shell' 11eval fi 12echo not reached 13__IN__ 14 15test_o -d 'syntax error in subshell' 16(eval fi; echo not reached) 17[ $? -ne 0 ] 18echo $? 19__IN__ 200 21__OUT__ 22 23test_o -d 'syntax error spares interactive shell' -i +m 24fi 25echo reached 26__IN__ 27reached 28__OUT__ 29 30test_O -d -e n 'expansion error kills non-interactive shell' 31unset a 32echo ${a?} 33echo not reached 34__IN__ 35 36test_o -d 'expansion error in subshell' 37unset a 38(echo ${a?}; echo not reached) 39[ $? -ne 0 ] 40echo $? 41__IN__ 420 43__OUT__ 44 45test_o -d 'expansion error spares interactive shell' -i +m 46unset a 47echo ${a?} 48[ $? -ne 0 ] 49echo $? 50__IN__ 510 52__OUT__ 53 54test_O -d -e 127 'command not found' 55./_no_such_command_ 56__IN__ 57 58############################################################################### 59 60test_O 'assignment error without command kills non-interactive shell' 61readonly a=a 62a=b 63printf 'not reached\n' 64__IN__ 65 66test_o 'assignment error without command in subshell' 67readonly a=a 68(a=b; printf 'not reached\n') 69[ $? -ne 0 ] 70echo $? 71__IN__ 720 73__OUT__ 74 75test_o 'assignment error without command spares interactive shell' -i +m 76readonly a=a 77a=b 78printf 'reached\n' 79__IN__ 80reached 81__OUT__ 82 83# $1 = line no. 84# $2 = command name 85test_assign() { 86 testcase "$1" -d \ 87 "assignment error on command $2 kills non-interactive shell" \ 88 3<<__IN__ 4</dev/null 89readonly a=a 90a=b $2 91printf 'not reached\n' 92__IN__ 93} 94 95# $1 = line no. 96# $2 = command name 97test_assign_s() { 98 testcase "$1" -d \ 99 "assignment error on command $2 in subshell" \ 100 3<<__IN__ 4<<\__OUT__ 101readonly a=a 102(a=b $2; echo not reached) 103[ \$? -ne 0 ] 104echo \$? 105__IN__ 1060 107__OUT__ 108} 109 110# $1 = line no. 111# $2 = command name 112test_assign_i() { 113 testcase "$1" -d \ 114 "assignment error on command $2 spares interactive shell" \ 115 -i +m 3<<__IN__ 4<<\__OUT__ 116readonly a=a 117a=b $2 118printf 'reached\n' 119__IN__ 120reached 121__OUT__ 122} 123 124test_assign "$LINENO" : 125test_assign_s "$LINENO" : 126test_assign_i "$LINENO" : 127test_assign "$LINENO" . 128test_assign_s "$LINENO" . 129test_assign_i "$LINENO" . 130test_assign "$LINENO" [ 131test_assign_s "$LINENO" [ 132test_assign_i "$LINENO" [ 133test_assign "$LINENO" alias 134test_assign_s "$LINENO" alias 135test_assign_i "$LINENO" alias 136test_assign "$LINENO" array 137test_assign_s "$LINENO" array 138test_assign_i "$LINENO" array 139test_assign "$LINENO" bg 140test_assign_s "$LINENO" bg 141test_assign_i "$LINENO" bg 142test_assign "$LINENO" bindkey 143test_assign_s "$LINENO" bindkey 144test_assign_i "$LINENO" bindkey 145test_assign "$LINENO" break 146test_assign_s "$LINENO" break 147test_assign_i "$LINENO" break 148test_assign "$LINENO" cat # example of external command 149test_assign_s "$LINENO" cat 150test_assign_i "$LINENO" cat 151test_assign "$LINENO" cd 152test_assign_s "$LINENO" cd 153test_assign_i "$LINENO" cd 154test_assign "$LINENO" command 155test_assign_s "$LINENO" command 156test_assign_i "$LINENO" command 157test_assign "$LINENO" complete 158test_assign_s "$LINENO" complete 159test_assign_i "$LINENO" complete 160test_assign "$LINENO" continue 161test_assign_s "$LINENO" continue 162test_assign_i "$LINENO" continue 163test_assign "$LINENO" dirs 164test_assign_s "$LINENO" dirs 165test_assign_i "$LINENO" dirs 166test_assign "$LINENO" disown 167test_assign_s "$LINENO" disown 168test_assign_i "$LINENO" disown 169test_assign "$LINENO" echo 170test_assign_s "$LINENO" echo 171test_assign_i "$LINENO" echo 172test_assign "$LINENO" eval 173test_assign_s "$LINENO" eval 174test_assign_i "$LINENO" eval 175test_assign "$LINENO" exec 176test_assign_s "$LINENO" exec 177test_assign_i "$LINENO" exec 178test_assign "$LINENO" exit 179test_assign_s "$LINENO" exit 180test_assign_i "$LINENO" exit 181test_assign "$LINENO" export 182test_assign_s "$LINENO" export 183test_assign_i "$LINENO" export 184test_assign "$LINENO" false 185test_assign_s "$LINENO" false 186test_assign_i "$LINENO" false 187test_assign "$LINENO" fc 188test_assign_s "$LINENO" fc 189test_assign_i "$LINENO" fc 190test_assign "$LINENO" fg 191test_assign_s "$LINENO" fg 192test_assign_i "$LINENO" fg 193test_assign "$LINENO" getopts 194test_assign_s "$LINENO" getopts 195test_assign_i "$LINENO" getopts 196test_assign "$LINENO" hash 197test_assign_s "$LINENO" hash 198test_assign_i "$LINENO" hash 199test_assign "$LINENO" help 200test_assign_s "$LINENO" help 201test_assign_i "$LINENO" help 202test_assign "$LINENO" history 203test_assign_s "$LINENO" history 204test_assign_i "$LINENO" history 205test_assign "$LINENO" jobs 206test_assign_s "$LINENO" jobs 207test_assign_i "$LINENO" jobs 208test_assign "$LINENO" kill 209test_assign_s "$LINENO" kill 210test_assign_i "$LINENO" kill 211test_assign "$LINENO" popd 212test_assign_s "$LINENO" popd 213test_assign_i "$LINENO" popd 214test_assign "$LINENO" printf 215test_assign_s "$LINENO" printf 216test_assign_i "$LINENO" printf 217test_assign "$LINENO" pushd 218test_assign_s "$LINENO" pushd 219test_assign_i "$LINENO" pushd 220test_assign "$LINENO" pwd 221test_assign_s "$LINENO" pwd 222test_assign_i "$LINENO" pwd 223test_assign "$LINENO" read 224test_assign_s "$LINENO" read 225test_assign_i "$LINENO" read 226test_assign "$LINENO" readonly 227test_assign_s "$LINENO" readonly 228test_assign_i "$LINENO" readonly 229test_assign "$LINENO" return 230test_assign_s "$LINENO" return 231test_assign_i "$LINENO" return 232test_assign "$LINENO" set 233test_assign_s "$LINENO" set 234test_assign_i "$LINENO" set 235test_assign "$LINENO" shift 236test_assign_s "$LINENO" shift 237test_assign_i "$LINENO" shift 238test_assign "$LINENO" suspend 239test_assign_s "$LINENO" suspend 240test_assign_i "$LINENO" suspend 241test_assign "$LINENO" test 242test_assign_s "$LINENO" test 243test_assign_i "$LINENO" test 244test_assign "$LINENO" times 245test_assign_s "$LINENO" times 246test_assign_i "$LINENO" times 247test_assign "$LINENO" trap 248test_assign_s "$LINENO" trap 249test_assign_i "$LINENO" trap 250test_assign "$LINENO" true 251test_assign_s "$LINENO" true 252test_assign_i "$LINENO" true 253test_assign "$LINENO" type 254test_assign_s "$LINENO" type 255test_assign_i "$LINENO" type 256test_assign "$LINENO" typeset 257test_assign_s "$LINENO" typeset 258test_assign_i "$LINENO" typeset 259test_assign "$LINENO" ulimit 260test_assign_s "$LINENO" ulimit 261test_assign_i "$LINENO" ulimit 262test_assign "$LINENO" umask 263test_assign_s "$LINENO" umask 264test_assign_i "$LINENO" umask 265test_assign "$LINENO" unalias 266test_assign_s "$LINENO" unalias 267test_assign_i "$LINENO" unalias 268test_assign "$LINENO" unset 269test_assign_s "$LINENO" unset 270test_assign_i "$LINENO" unset 271test_assign "$LINENO" wait 272test_assign_s "$LINENO" wait 273test_assign_i "$LINENO" wait 274test_assign "$LINENO" ./_no_such_command_ 275test_assign_s "$LINENO" ./_no_such_command_ 276test_assign_i "$LINENO" ./_no_such_command_ 277 278# $1 = line no. 279# $2 = built-in name 280test_special_builtin_redirect() { 281 testcase "$1" -d \ 282 "redirection error on special built-in $2 kills non-interactive shell" \ 283 3<<__IN__ 4</dev/null 284$2 <_no_such_file_ 285printf 'not reached\n' 286__IN__ 287} 288 289# $1 = line no. 290# $2 = built-in name 291test_special_builtin_redirect_s() { 292 testcase "$1" -d \ 293 "redirection error on special built-in $2 in subshell" \ 294 3<<__IN__ 4<<\__OUT__ 295($2 <_no_such_file_; echo not reached) 296[ \$? -ne 0 ] 297echo \$? 298__IN__ 2990 300__OUT__ 301} 302 303# $1 = line no. 304# $2 = built-in name 305test_special_builtin_redirect_i() { 306 testcase "$1" -d \ 307 "redirection error on special built-in $2 spares interactive shell" \ 308 -i +m 3<<__IN__ 4<<\__OUT__ 309$2 <_no_such_file_ 310printf 'reached\n' 311__IN__ 312reached 313__OUT__ 314} 315 316test_special_builtin_redirect "$LINENO" : 317test_special_builtin_redirect_s "$LINENO" : 318test_special_builtin_redirect_i "$LINENO" : 319test_special_builtin_redirect "$LINENO" . 320test_special_builtin_redirect_s "$LINENO" . 321test_special_builtin_redirect_i "$LINENO" . 322test_special_builtin_redirect "$LINENO" break 323test_special_builtin_redirect_s "$LINENO" break 324test_special_builtin_redirect_i "$LINENO" break 325test_special_builtin_redirect "$LINENO" continue 326test_special_builtin_redirect_s "$LINENO" continue 327test_special_builtin_redirect_i "$LINENO" continue 328test_special_builtin_redirect "$LINENO" eval 329test_special_builtin_redirect_s "$LINENO" eval 330test_special_builtin_redirect_i "$LINENO" eval 331test_special_builtin_redirect "$LINENO" exec 332test_special_builtin_redirect_s "$LINENO" exec 333test_special_builtin_redirect_i "$LINENO" exec 334test_special_builtin_redirect "$LINENO" exit 335test_special_builtin_redirect_s "$LINENO" exit 336test_special_builtin_redirect_i "$LINENO" exit 337test_special_builtin_redirect "$LINENO" export 338test_special_builtin_redirect_s "$LINENO" export 339test_special_builtin_redirect_i "$LINENO" export 340test_special_builtin_redirect "$LINENO" readonly 341test_special_builtin_redirect_s "$LINENO" readonly 342test_special_builtin_redirect_i "$LINENO" readonly 343test_special_builtin_redirect "$LINENO" return 344test_special_builtin_redirect_s "$LINENO" return 345test_special_builtin_redirect_i "$LINENO" return 346test_special_builtin_redirect "$LINENO" set 347test_special_builtin_redirect_s "$LINENO" set 348test_special_builtin_redirect_i "$LINENO" set 349test_special_builtin_redirect "$LINENO" shift 350test_special_builtin_redirect_s "$LINENO" shift 351test_special_builtin_redirect_i "$LINENO" shift 352test_special_builtin_redirect "$LINENO" times 353test_special_builtin_redirect_s "$LINENO" times 354test_special_builtin_redirect_i "$LINENO" times 355test_special_builtin_redirect "$LINENO" trap 356test_special_builtin_redirect_s "$LINENO" trap 357test_special_builtin_redirect_i "$LINENO" trap 358test_special_builtin_redirect "$LINENO" unset 359test_special_builtin_redirect_s "$LINENO" unset 360test_special_builtin_redirect_i "$LINENO" unset 361 362test_o 'redirection error on non-special built-in cd spares shell' 363cd <_no_such_file_ 364test $? -ne 0 && echo ok 365__IN__ 366ok 367__OUT__ 368 369test_o 'redirection error on non-existing command spares shell' 370./_no_such_command_ <_no_such_file_ 371test $? -ne 0 && echo ok 372__IN__ 373ok 374__OUT__ 375 376test_o 'redirection error without command spares shell' 377<_no_such_file_ 378test $? -ne 0 && echo ok 379__IN__ 380ok 381__OUT__ 382 383# Command syntax error for special built-ins is not tested here because we can 384# not portably cause syntax error since any syntax can be accepted as an 385# extension. 386 387# vim: set ft=sh ts=8 sts=4 sw=4 noet: 388