| 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 | # in posix mode, assignment statements preceding special builtins are
|
|---|
| 180 | # reflected in the shell environment. `.' and `eval' need special-case
|
|---|
| 181 | # code.
|
|---|
| 182 | set -o posix
|
|---|
| 183 | echo $AVAR
|
|---|
| 184 | AVAR=foo . ./source1.sub
|
|---|
| 185 | echo $AVAR
|
|---|
| 186 |
|
|---|
| 187 | AVAR=AVAR
|
|---|
| 188 | echo $AVAR
|
|---|
| 189 | AVAR=foo eval echo \$AVAR
|
|---|
| 190 | echo $AVAR
|
|---|
| 191 |
|
|---|
| 192 | AVAR=AVAR
|
|---|
| 193 | echo $AVAR
|
|---|
| 194 | AVAR=foo :
|
|---|
| 195 | echo $AVAR
|
|---|
| 196 | set +o posix
|
|---|
| 197 |
|
|---|
| 198 | # but assignment statements preceding `export' are always reflected in
|
|---|
| 199 | # the environment
|
|---|
| 200 | foo="" export foo
|
|---|
| 201 | declare -p foo
|
|---|
| 202 | unset foo
|
|---|
| 203 |
|
|---|
| 204 | # assignment statements preceding `declare' should be displayed correctly,
|
|---|
| 205 | # but not persist after the command
|
|---|
| 206 | FOO='$$' declare -p FOO
|
|---|
| 207 | declare -p FOO
|
|---|
| 208 | unset FOO
|
|---|
| 209 |
|
|---|
| 210 | # except for `declare -x', which should be equivalent to `export'
|
|---|
| 211 | FOO='$$' declare -x FOO
|
|---|
| 212 | declare -p FOO
|
|---|
| 213 | unset FOO
|
|---|
| 214 |
|
|---|
| 215 | # test out kill -l. bash versions prior to 2.01 did `kill -l num' wrong
|
|---|
| 216 | sigone=$(kill -l | sed -n 's:^ 1) *\([^ ]*\)[ ].*$:\1:p')
|
|---|
| 217 |
|
|---|
| 218 | case "$(kill -l 1)" in
|
|---|
| 219 | ${sigone/SIG/}) echo ok;;
|
|---|
| 220 | *) echo oops -- kill -l failure;;
|
|---|
| 221 | esac
|
|---|
| 222 |
|
|---|
| 223 | # kill -l and trap -l should display exactly the same output
|
|---|
| 224 | sigonea=$(trap -l | sed -n 's:^ 1) *\([^ ]*\)[ ].*$:\1:p')
|
|---|
| 225 |
|
|---|
| 226 | if [ "$sigone" != "$sigonea" ]; then
|
|---|
| 227 | echo oops -- kill -l and trap -l differ
|
|---|
| 228 | fi
|
|---|
| 229 |
|
|---|
| 230 | # POSIX.2 says that exit statuses > 128 are mapped to signal names by
|
|---|
| 231 | # subtracting 128 so you can find out what signal killed a process
|
|---|
| 232 | case "$(kill -l $(( 128 + 1)) )" in
|
|---|
| 233 | ${sigone/SIG/}) echo ok;;
|
|---|
| 234 | *) echo oops -- kill -l 129 failure;;
|
|---|
| 235 | esac
|
|---|
| 236 |
|
|---|
| 237 | # out-of-range signal numbers should report the argument in the error
|
|---|
| 238 | # message, not 128 less than the argument
|
|---|
| 239 | kill -l 4096
|
|---|
| 240 |
|
|---|
| 241 | # kill -l NAME should return the signal number
|
|---|
| 242 | kill -l ${sigone/SIG/}
|
|---|
| 243 |
|
|---|
| 244 | # test behavior of shopt xpg_echo
|
|---|
| 245 | ${THIS_SH} ./builtins2.sub
|
|---|
| 246 |
|
|---|
| 247 | # this must be last -- it is a fatal error
|
|---|
| 248 | exit status
|
|---|
| 249 |
|
|---|
| 250 | echo after bad exit
|
|---|