1 ## compare_shells: dash bash mksh zsh
2 ## oils_failures_allowed: 4
3
4 #### usage: too many args
5
6 # most shells don't verify this
7 umask 1 2
8 if test $? -ne 0; then
9 echo fail
10 fi
11 ## STDOUT:
12 fail
13 ## END
14 ## BUG dash/bash/mksh STDOUT:
15 ## END
16
17 #### usage: bad symbolic input
18 umask b=rwx
19 ## status: 1
20 ## OK dash status: 2
21
22 #### usage: invalid octal digits
23 umask 089
24 case $? in
25 1) echo error ;;
26 2) echo error ;;
27 esac
28 ## STDOUT:
29 error
30 ## END
31
32 #### usage: large octal number
33 umask 0022
34
35 # osh and other shells treat truncate 0o1234567 as 0o0567
36 umask 1234567
37 echo status=$?
38
39 umask
40
41 ## status: 0
42 ## STDOUT:
43 status=1
44 0022
45 ## END
46 ## BUG mksh/zsh/dash STDOUT:
47 status=0
48 0567
49 ## END
50
51 #### 'umask' without args prints the umask
52 umask | tail --bytes 4 # 0022 versus 022
53 echo status=$?
54
55 ## STDOUT:
56 022
57 status=0
58 ## END
59
60 #### 'umask -S' prints symbolic umask
61 umask -S | grep 'u=[rwx]*,g=[rwx]*,o=[rwx]*'
62 echo status=$?
63
64 ## STDOUT:
65 u=rwx,g=rx,o=rx
66 status=0
67 ## END
68
69 #### 'umask -p' prints a form that can be eval'd
70 umask -p
71 echo status=$?
72
73 ## STDOUT:
74 umask 0022
75 status=0
76 ## END
77 ## N-I mksh/zsh STDOUT:
78 status=1
79 ## END
80 ## N-I dash STDOUT:
81 status=2
82 ## END
83
84 #### 'umask 0002' sets the umask
85 umask 0002
86 echo one > $TMP/umask-one
87
88 umask 0022
89 echo two > $TMP/umask-two
90
91 stat -c '%a' $TMP/umask-one $TMP/umask-two
92
93 ## status: 0
94 ## STDOUT:
95 664
96 644
97 ## END
98 ## stderr-json: ""
99
100 #### set umask with symbolic mode: g-w,o-w
101
102 umask 0002 # begin in a known state for the test
103 # open()s 'umask-one' with mask 0666, then subtracts 0002 -> 0664
104 echo one > $TMP/umask-one
105
106 umask g-w,o-w
107 echo two > $TMP/umask-two
108
109 stat -c '%a' $TMP/umask-one $TMP/umask-two
110
111 ## status: 0
112 ## STDOUT:
113 664
114 644
115 ## END
116 ## stderr-json: ""
117
118 #### set umask with symbolic mode: u-rw ... u=,g+,o- ...
119
120 umask 0000
121 umask u-rw
122 echo status0=$?
123 umask | tail -c 4
124
125 umask 0700
126 umask u=r
127 echo status1=$?
128 umask | tail -c 4
129
130 umask 0000
131 umask u=r,g=w,o=x
132 echo status2=$?
133 umask | tail -c 4
134
135 umask 0777
136 umask u+r,g+w,o+x
137 echo status3=$?
138 umask | tail -c 4
139
140 umask 0000
141 umask u-r,g-w,o-x
142 echo status4=$?
143 umask | tail -c 4
144
145 umask 0137
146 umask u=,g+,o-
147 echo status5=$?
148 umask | tail -c 4
149
150 ## status: 0
151 ## STDOUT:
152 status0=0
153 600
154 status1=0
155 300
156 status2=0
157 356
158 status3=0
159 356
160 status4=0
161 421
162 status5=0
163 737
164 ## END
165
166 #### umask with too many arguments (i.e. extra spaces)
167 umask 0111
168 # spaces are an error in bash
169 # dash & mksh only interpret the first one
170 umask u=, g+, o-
171 if test $? -ne 0; then
172 echo ok
173 fi
174 umask | tail -c 4
175 ## status: 0
176 ## STDOUT:
177 ok
178 111
179 ## END
180 ## BUG dash/mksh STDOUT:
181 711
182 ## END
183
184 #### umask allow overwriting and duplicates
185 umask 0111
186 umask u=rwx,u=rw,u=r,u=,g=rwx
187 umask | tail -c 4
188 ## status: 0
189 ## STDOUT:
190 701
191 ## END
192
193 #### umask a is valid who
194 umask 0732
195 umask a=rwx
196 umask | tail -c 4
197
198 umask 0124
199 umask a+r
200 umask | tail -c 4
201
202 umask 0124
203 umask a-r
204 umask | tail -c 4
205 ## status: 0
206 ## STDOUT:
207 000
208 120
209 564
210 ## END
211
212 #### umask X perm
213 umask 0124
214 umask a=X
215 echo ret0 = $?
216 umask | tail -c 4
217
218 umask 0246
219 umask a=X
220 echo ret1 = $?
221 umask | tail -c 4
222
223 umask 0246
224 umask a-X
225 echo ret2 = $?
226 umask | tail -c 4
227 ## status: 0
228 ## STDOUT:
229 ret0 = 0
230 666
231 ret1 = 0
232 777
233 ret2 = 0
234 246
235 ## END
236 ## BUG dash/mksh STDOUT:
237 ret0 = 0
238 666
239 ret1 = 0
240 666
241 ret2 = 0
242 357
243 ## END
244 ## N-I bash/zsh STDOUT:
245 ret0 = 1
246 124
247 ret1 = 1
248 246
249 ret2 = 1
250 246
251 ## END
252
253 #### umask s perm
254 umask 0124
255 umask a-s
256 echo ret0 = $?
257 umask | tail -c 4
258
259 umask 0124
260 umask a+s
261 echo ret1 = $?
262 umask | tail -c 4
263
264 umask 0124
265 umask a=s
266 echo ret2 = $?
267 umask | tail -c 4
268 ## status: 0
269 ## STDOUT:
270 ret0 = 0
271 124
272 ret1 = 0
273 124
274 ret2 = 0
275 777
276 ## END
277 ## N-I bash/zsh STDOUT:
278 ret0 = 1
279 124
280 ret1 = 1
281 124
282 ret2 = 1
283 124
284 ## END
285
286 #### umask t perm
287 umask 0124
288 umask a-t
289 echo ret0 = $?
290 umask | tail -c 4
291
292 umask 0124
293 umask a+t
294 echo ret1 = $?
295 umask | tail -c 4
296
297 umask 0124
298 umask a=t
299 echo ret2 = $?
300 umask | tail -c 4
301 ## status: 0
302 ## STDOUT:
303 ret0 = 0
304 124
305 ret1 = 0
306 124
307 ret2 = 0
308 777
309 ## END
310 ## N-I bash/zsh/mksh STDOUT:
311 ret0 = 1
312 124
313 ret1 = 1
314 124
315 ret2 = 1
316 124
317 ## END
318 ## N-I dash STDOUT:
319 ret0 = 2
320 124
321 ret1 = 2
322 124
323 ret2 = 2
324 124
325 ## END
326
327 #### umask default who
328 umask 0124
329 umask =
330 umask | tail -c 4
331
332 umask 0124
333 umask =rx
334 echo ret = $?
335 umask | tail -c 4
336
337 umask 0124
338 umask +
339 umask | tail -c 4
340
341 umask 0124
342 # zsh ALSO treats this as just `umask`
343 umask - >/dev/null
344 umask | tail -c 4
345 ## status: 0
346 ## BUG zsh status: 1
347 ## STDOUT:
348 777
349 ret = 0
350 222
351 124
352 124
353 ## END
354 ## BUG zsh STDOUT:
355 777
356 ## END
357
358 #### umask bare op
359 umask 0124
360 umask =+=
361 umask | tail -c 4
362
363 umask 0124
364 umask +=
365 umask | tail -c 4
366
367 umask 0124
368 umask =+rwx+rx
369 umask | tail -c 4
370 ## status: 0
371 ## BUG zsh status: 1
372 ## STDOUT:
373 777
374 777
375 000
376 ## END
377 ## N-I bash STDOUT:
378 124
379 124
380 124
381 ## END
382 ## BUG zsh STDOUT:
383 ## END
384
385 #### umask bare op -
386 umask 0124
387 umask -rwx
388 umask | tail -c 4
389
390 umask 0124
391 umask -wx
392 umask | tail -c 4
393
394 umask 0124
395 umask -=+
396 umask | tail -c 4
397 ## status: 0
398 ## STDOUT:
399 777
400 337
401 777
402 ## END
403 ## N-I dash/bash/mksh/zsh STDOUT:
404 124
405 124
406 124
407 ## END
408
409 #### umask permcopy
410 umask 0124
411 umask a=u
412 umask | tail -c 4
413
414 umask 0365
415 umask a=g
416 umask | tail -c 4
417
418 umask 0124
419 umask a=o
420 umask | tail -c 4
421 ## status: 0
422 ## STDOUT:
423 111
424 666
425 444
426 ## END
427 ## N-I bash/zsh STDOUT:
428 124
429 365
430 124
431 ## END
432
433 #### umask permcopy running value
434 umask 0124
435 umask a=,a=u
436 umask | tail -c 4
437
438 umask 0124
439 umask a=
440 umask a=u
441 umask | tail -c 4
442 ## status: 0
443 ## STDOUT:
444 111
445 777
446 ## END
447 ## N-I bash/zsh STDOUT:
448 124
449 777
450 ## END
451
452 #### umask sequential actions
453 umask 0124
454 umask u+r+w+x
455 umask | tail -c 4
456
457 umask 0124
458 umask a+r+w+x,o-w
459 umask | tail -c 4
460
461 umask 0124
462 umask a+x+wr-r
463 umask | tail -c 4
464 ## status: 0
465 ## STDOUT:
466 024
467 002
468 444
469 ## END
470 ## N-I bash/zsh STDOUT:
471 124
472 124
473 124
474 ## END
475