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