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