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