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