Bash-4.3 distribution sources and documentation
[platform/upstream/bash.git] / tests / builtins.tests
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 # this must be last -- it is a fatal error
260 exit status
261
262 echo after bad exit