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