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