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