|
| 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 |
| 83 | +umask -p |
| 84 | +umask -p -S |
| 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' ) |
| 112 | +(exec -l -a specialname ${THIS_SH} -c 'echo $0' ) |
| 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 |
| 115 | +# sets on startup. Also test code that prefixes argv[0] with a dash. |
| 116 | +(export FOO=BAR ; exec -c -l printenv ) | grep FOO |
| 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 | + |
| 126 | +# this had better succeed, since command -p guarantees we will find the |
| 127 | +# standard utilties |
| 128 | +command -p hash rm |
| 129 | + |
| 130 | +# check out source/. |
| 131 | + |
| 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 | + |
| 139 | +AVAR=AVAR |
| 140 | + |
| 141 | +. ./source1.sub |
| 142 | +AVAR=foo . ./source1.sub |
| 143 | + |
| 144 | +. ./source2.sub |
| 145 | +echo $? |
| 146 | + |
| 147 | +set -- a b c |
| 148 | +. ./source3.sub |
| 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 "$@" |
| 154 | +. ./source3.sub x y z |
| 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 |
| 163 | +. source4.sub |
| 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 "$@" |
| 170 | +. source4.sub x y z |
| 171 | +echo "$@" |
| 172 | + |
| 173 | +# test out cd and $CDPATH |
| 174 | +${THIS_SH} ./builtins1.sub |
| 175 | + |
| 176 | +# test behavior of `.' when given a non-existant file argument |
| 177 | +${THIS_SH} ./source5.sub |
| 178 | + |
| 179 | +# test bugs in sourcing non-regular files, fixed post-bash-3.2 |
| 180 | +${THIS_SH} ./source6.sub |
| 181 | + |
| 182 | +# test bugs with source called from multiline aliases and other contexts |
| 183 | +${THIS_SH} ./source7.sub |
| 184 | + |
| 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 |
| 190 | +AVAR=foo . ./source1.sub |
| 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 |
| 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 |
| 220 | + |
| 221 | +# test out kill -l. bash versions prior to 2.01 did `kill -l num' wrong |
| 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 | + |
| 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 | + |
| 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/} |
| 249 | + |
| 250 | +# test behavior of shopt xpg_echo |
| 251 | +${THIS_SH} ./builtins2.sub |
| 252 | + |
| 253 | +# test behavior of declare -g |
| 254 | +${THIS_SH} ./builtins3.sub |
| 255 | + |
| 256 | +# test behavior of using declare to create variables without assigning values |
| 257 | +${THIS_SH} ./builtins4.sub |
| 258 | + |
| 259 | +# test behavior of set and unset array variables |
| 260 | +${THIS_SH} ./builtins5.sub |
| 261 | + |
| 262 | +# test behavior of unset builtin with -f and -v options |
| 263 | +${THIS_SH} ./builtins6.sub |
| 264 | + |
| 265 | +# this must be last -- it is a fatal error |
| 266 | +exit status |
| 267 | + |
| 268 | +echo after bad exit |
0 commit comments