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
|
---|