Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 1 | # tests for miscellaneous builtins not tested elsewhere |
| 2 | set +p |
| 3 | set +o posix |
| 4 | |
| 5 | ulimit -c 0 2>/dev/null |
| 6 | |
| 7 | # check that break breaks loops |
| 8 | for i in a b c; do echo $i; break; echo bad-$i; done |
| 9 | echo end-1 |
| 10 | for i in a b c; do echo $i; break 1; echo bad-$i; done |
| 11 | echo end-2 |
| 12 | for i in a b c; do |
| 13 | for j in x y z; do |
| 14 | echo $i:$j |
| 15 | break |
| 16 | echo bad-$i |
| 17 | done |
| 18 | echo end-$i |
| 19 | done |
| 20 | echo end-3 |
| 21 | |
| 22 | # check that break breaks nested loops |
| 23 | for i in a b c; do |
| 24 | for j in x y z; do |
| 25 | echo $i:$j |
| 26 | break 2 |
| 27 | echo bad-$i |
| 28 | done |
| 29 | echo end-$i |
| 30 | done |
| 31 | echo end |
| 32 | |
| 33 | # check that continue continues loops |
| 34 | for i in a b c; do echo $i; continue; echo bad-$i ; done |
| 35 | echo end-1 |
| 36 | for i in a b c; do echo $i; continue 1; echo bad-$i; done |
| 37 | echo end-2 |
| 38 | for i in a b c; do |
| 39 | for j in x y z; do |
| 40 | echo $i:$j |
| 41 | continue |
| 42 | echo bad-$i-$j |
| 43 | done |
| 44 | echo end-$i |
| 45 | done |
| 46 | echo end-3 |
| 47 | |
| 48 | # check that continue breaks out of nested loops |
| 49 | for i in a b c; do |
| 50 | for j in x y z; do |
| 51 | echo $i:$j |
| 52 | continue 2 |
| 53 | echo bad-$i-$j |
| 54 | done |
| 55 | echo end-$i |
| 56 | done |
| 57 | echo end |
| 58 | |
| 59 | # check that `eval' re-evaluates arguments, but `builtin' and `command' do not |
| 60 | AVAR='$BVAR' |
| 61 | BVAR=foo |
| 62 | |
| 63 | echo $AVAR |
| 64 | builtin echo $AVAR |
| 65 | command echo $AVAR |
| 66 | eval echo \$AVAR |
| 67 | eval echo $AVAR |
| 68 | |
| 69 | # test out eval with a temp environment |
| 70 | AVAR=bar eval echo \$AVAR |
| 71 | BVAR=xxx eval echo $AVAR |
| 72 | |
| 73 | unset -v AVAR BVAR |
| 74 | |
| 75 | # test umask |
| 76 | mask=$(umask) |
| 77 | umask 022 |
| 78 | umask |
| 79 | umask -S |
| 80 | umask -S u=rwx,g=rwx,o=rx >/dev/null # 002 |
| 81 | umask |
| 82 | umask -S |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 83 | umask -p |
| 84 | umask -p -S |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 85 | umask 0 |
| 86 | umask -S |
| 87 | umask ${mask} # restore original mask |
| 88 | |
| 89 | # builtin/command without arguments should do nothing. maybe someday they will |
| 90 | builtin |
| 91 | command |
| 92 | |
| 93 | # test enable |
| 94 | enable -ps |
| 95 | |
| 96 | enable -aps ; enable -nps |
| 97 | |
| 98 | enable -n test |
| 99 | case "$(type -t test)" in |
| 100 | builtin) echo oops -- enable -n test failed ;; |
| 101 | *) echo enable -n test worked ;; |
| 102 | esac |
| 103 | |
| 104 | enable test |
| 105 | case "$(type -t test)" in |
| 106 | builtin) echo enable test worked ;; |
| 107 | *) echo oops -- enable test failed ;; |
| 108 | esac |
| 109 | |
| 110 | # test options to exec |
| 111 | (exec -a specialname ${THIS_SH} -c 'echo $0' ) |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 112 | (exec -l -a specialname ${THIS_SH} -c 'echo $0' ) |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 113 | # test `clean' environment. if /bin/sh is bash, and the script version of |
| 114 | # printenv is run, there will be variables in the environment that bash |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 115 | # sets on startup. Also test code that prefixes argv[0] with a dash. |
| 116 | (export FOO=BAR ; exec -c -l printenv ) | grep FOO |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 117 | (FOO=BAR exec -c printenv ) | grep FOO |
| 118 | |
| 119 | (export FOO=BAR ; exec printenv ) | grep FOO |
| 120 | (FOO=BAR exec printenv ) | grep FOO |
| 121 | |
| 122 | # ok, forget everything about hashed commands |
| 123 | hash -r |
| 124 | hash |
| 125 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 126 | # this had better succeed, since command -p guarantees we will find the |
| 127 | # standard utilties |
| 128 | command -p hash rm |
| 129 | |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 130 | # check out source/. |
| 131 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 132 | # sourcing a zero-length-file had better not be an error |
| 133 | rm -f /tmp/zero-length-file |
| 134 | cp /dev/null /tmp/zero-length-file |
| 135 | . /tmp/zero-length-file |
| 136 | echo $? |
| 137 | rm /tmp/zero-length-file |
| 138 | |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 139 | AVAR=AVAR |
| 140 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 141 | . ./source1.sub |
| 142 | AVAR=foo . ./source1.sub |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 143 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 144 | . ./source2.sub |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 145 | echo $? |
| 146 | |
| 147 | set -- a b c |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 148 | . ./source3.sub |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 149 | |
| 150 | # make sure source with arguments does not change the shell's positional |
| 151 | # parameters, but that the sourced file sees the arguments as its |
| 152 | # positional parameters |
| 153 | echo "$@" |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 154 | . ./source3.sub x y z |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 155 | echo "$@" |
| 156 | |
| 157 | # but if the sourced script sets the positional parameters explicitly, they |
| 158 | # should be reflected in the calling shell's positional parameters. this |
| 159 | # also tests one of the shopt options that controls source using $PATH to |
| 160 | # find the script |
| 161 | echo "$@" |
| 162 | shopt -u sourcepath |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 163 | . source4.sub |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 164 | echo "$@" |
| 165 | |
| 166 | # this is complicated when the sourced scripts gets its own positional |
| 167 | # parameters from arguments to `.' |
| 168 | set -- a b c |
| 169 | echo "$@" |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 170 | . source4.sub x y z |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 171 | echo "$@" |
| 172 | |
| 173 | # test out cd and $CDPATH |
Jari Aalto | bb70624 | 2000-03-17 21:46:59 +0000 | [diff] [blame] | 174 | ${THIS_SH} ./builtins1.sub |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 175 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 176 | # test behavior of `.' when given a non-existant file argument |
| 177 | ${THIS_SH} ./source5.sub |
| 178 | |
Jari Aalto | 3185942 | 2009-01-12 13:36:28 +0000 | [diff] [blame] | 179 | # test bugs in sourcing non-regular files, fixed post-bash-3.2 |
| 180 | ${THIS_SH} ./source6.sub |
| 181 | |
Chet Ramey | ac50fba | 2014-02-26 09:36:43 -0500 | [diff] [blame] | 182 | # test bugs with source called from multiline aliases and other contexts |
| 183 | ${THIS_SH} ./source7.sub |
| 184 | |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 185 | # in posix mode, assignment statements preceding special builtins are |
| 186 | # reflected in the shell environment. `.' and `eval' need special-case |
| 187 | # code. |
| 188 | set -o posix |
| 189 | echo $AVAR |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 190 | AVAR=foo . ./source1.sub |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 191 | echo $AVAR |
| 192 | |
| 193 | AVAR=AVAR |
| 194 | echo $AVAR |
| 195 | AVAR=foo eval echo \$AVAR |
| 196 | echo $AVAR |
| 197 | |
| 198 | AVAR=AVAR |
| 199 | echo $AVAR |
| 200 | AVAR=foo : |
| 201 | echo $AVAR |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 202 | set +o posix |
| 203 | |
| 204 | # but assignment statements preceding `export' are always reflected in |
| 205 | # the environment |
| 206 | foo="" export foo |
| 207 | declare -p foo |
| 208 | unset foo |
| 209 | |
| 210 | # assignment statements preceding `declare' should be displayed correctly, |
| 211 | # but not persist after the command |
| 212 | FOO='$$' declare -p FOO |
| 213 | declare -p FOO |
| 214 | unset FOO |
| 215 | |
| 216 | # except for `declare -x', which should be equivalent to `export' |
| 217 | FOO='$$' declare -x FOO |
| 218 | declare -p FOO |
| 219 | unset FOO |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 220 | |
| 221 | # test out kill -l. bash versions prior to 2.01 did `kill -l num' wrong |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 222 | sigone=$(kill -l | sed -n 's:^ 1) *\([^ ]*\)[ ].*$:\1:p') |
| 223 | |
| 224 | case "$(kill -l 1)" in |
| 225 | ${sigone/SIG/}) echo ok;; |
| 226 | *) echo oops -- kill -l failure;; |
| 227 | esac |
| 228 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 229 | # kill -l and trap -l should display exactly the same output |
| 230 | sigonea=$(trap -l | sed -n 's:^ 1) *\([^ ]*\)[ ].*$:\1:p') |
| 231 | |
| 232 | if [ "$sigone" != "$sigonea" ]; then |
| 233 | echo oops -- kill -l and trap -l differ |
| 234 | fi |
| 235 | |
Jari Aalto | d166f04 | 1997-06-05 14:59:13 +0000 | [diff] [blame] | 236 | # POSIX.2 says that exit statuses > 128 are mapped to signal names by |
| 237 | # subtracting 128 so you can find out what signal killed a process |
| 238 | case "$(kill -l $(( 128 + 1)) )" in |
| 239 | ${sigone/SIG/}) echo ok;; |
| 240 | *) echo oops -- kill -l 129 failure;; |
| 241 | esac |
| 242 | |
| 243 | # out-of-range signal numbers should report the argument in the error |
| 244 | # message, not 128 less than the argument |
| 245 | kill -l 4096 |
| 246 | |
| 247 | # kill -l NAME should return the signal number |
| 248 | kill -l ${sigone/SIG/} |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 249 | |
Jari Aalto | bb70624 | 2000-03-17 21:46:59 +0000 | [diff] [blame] | 250 | # test behavior of shopt xpg_echo |
| 251 | ${THIS_SH} ./builtins2.sub |
| 252 | |
Chet Ramey | 495aee4 | 2011-11-22 19:11:26 -0500 | [diff] [blame] | 253 | # test behavior of declare -g |
| 254 | ${THIS_SH} ./builtins3.sub |
| 255 | |
Chet Ramey | ac50fba | 2014-02-26 09:36:43 -0500 | [diff] [blame] | 256 | # test behavior of using declare to create variables without assigning values |
| 257 | ${THIS_SH} ./builtins4.sub |
| 258 | |
Jari Aalto | cce855b | 1998-04-17 19:52:44 +0000 | [diff] [blame] | 259 | # this must be last -- it is a fatal error |
| 260 | exit status |
| 261 | |
| 262 | echo after bad exit |