OILS / spec / builtin-umask.test.sh View on Github | oils.pub

475 lines, 283 significant
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
7umask 1 2
8if test $? -ne 0; then
9 echo fail
10fi
11## STDOUT:
12fail
13## END
14## BUG dash/bash/mksh STDOUT:
15## END
16
17#### usage: bad symbolic input
18umask b=rwx
19## status: 1
20## OK dash status: 2
21
22#### usage: invalid octal digits
23umask 089
24case $? in
25 1) echo error ;;
26 2) echo error ;;
27esac
28## STDOUT:
29error
30## END
31
32#### usage: large octal number
33umask 0022
34
35# osh and other shells treat truncate 0o1234567 as 0o0567
36umask 1234567
37echo status=$?
38
39umask
40
41## status: 0
42## STDOUT:
43status=1
440022
45## END
46## BUG mksh/zsh/dash STDOUT:
47status=0
480567
49## END
50
51#### 'umask' without args prints the umask
52umask | tail --bytes 4 # 0022 versus 022
53echo status=$?
54
55## STDOUT:
56022
57status=0
58## END
59
60#### 'umask -S' prints symbolic umask
61umask -S | grep 'u=[rwx]*,g=[rwx]*,o=[rwx]*'
62echo status=$?
63
64## STDOUT:
65u=rwx,g=rx,o=rx
66status=0
67## END
68
69#### 'umask -p' prints a form that can be eval'd
70umask -p
71echo status=$?
72
73## STDOUT:
74umask 0022
75status=0
76## END
77## N-I mksh/zsh STDOUT:
78status=1
79## END
80## N-I dash STDOUT:
81status=2
82## END
83
84#### 'umask 0002' sets the umask
85umask 0002
86echo one > $TMP/umask-one
87
88umask 0022
89echo two > $TMP/umask-two
90
91stat -c '%a' $TMP/umask-one $TMP/umask-two
92
93## status: 0
94## STDOUT:
95664
96644
97## END
98## stderr-json: ""
99
100#### set umask with symbolic mode: g-w,o-w
101
102umask 0002 # begin in a known state for the test
103# open()s 'umask-one' with mask 0666, then subtracts 0002 -> 0664
104echo one > $TMP/umask-one
105
106umask g-w,o-w
107echo two > $TMP/umask-two
108
109stat -c '%a' $TMP/umask-one $TMP/umask-two
110
111## status: 0
112## STDOUT:
113664
114644
115## END
116## stderr-json: ""
117
118#### set umask with symbolic mode: u-rw ... u=,g+,o- ...
119
120umask 0000
121umask u-rw
122echo status0=$?
123umask | tail -c 4
124
125umask 0700
126umask u=r
127echo status1=$?
128umask | tail -c 4
129
130umask 0000
131umask u=r,g=w,o=x
132echo status2=$?
133umask | tail -c 4
134
135umask 0777
136umask u+r,g+w,o+x
137echo status3=$?
138umask | tail -c 4
139
140umask 0000
141umask u-r,g-w,o-x
142echo status4=$?
143umask | tail -c 4
144
145umask 0137
146umask u=,g+,o-
147echo status5=$?
148umask | tail -c 4
149
150## status: 0
151## STDOUT:
152status0=0
153600
154status1=0
155300
156status2=0
157356
158status3=0
159356
160status4=0
161421
162status5=0
163737
164## END
165
166#### umask with too many arguments (i.e. extra spaces)
167umask 0111
168# spaces are an error in bash
169# dash & mksh only interpret the first one
170umask u=, g+, o-
171if test $? -ne 0; then
172 echo ok
173fi
174umask | tail -c 4
175## status: 0
176## STDOUT:
177ok
178111
179## END
180## BUG dash/mksh STDOUT:
181711
182## END
183
184#### umask allow overwriting and duplicates
185umask 0111
186umask u=rwx,u=rw,u=r,u=,g=rwx
187umask | tail -c 4
188## status: 0
189## STDOUT:
190701
191## END
192
193#### umask a is valid who
194umask 0732
195umask a=rwx
196umask | tail -c 4
197
198umask 0124
199umask a+r
200umask | tail -c 4
201
202umask 0124
203umask a-r
204umask | tail -c 4
205## status: 0
206## STDOUT:
207000
208120
209564
210## END
211
212#### umask X perm
213umask 0124
214umask a=X
215echo ret0 = $?
216umask | tail -c 4
217
218umask 0246
219umask a=X
220echo ret1 = $?
221umask | tail -c 4
222
223umask 0246
224umask a-X
225echo ret2 = $?
226umask | tail -c 4
227## status: 0
228## STDOUT:
229ret0 = 0
230666
231ret1 = 0
232777
233ret2 = 0
234246
235## END
236## BUG dash/mksh STDOUT:
237ret0 = 0
238666
239ret1 = 0
240666
241ret2 = 0
242357
243## END
244## N-I bash/zsh STDOUT:
245ret0 = 1
246124
247ret1 = 1
248246
249ret2 = 1
250246
251## END
252
253#### umask s perm
254umask 0124
255umask a-s
256echo ret0 = $?
257umask | tail -c 4
258
259umask 0124
260umask a+s
261echo ret1 = $?
262umask | tail -c 4
263
264umask 0124
265umask a=s
266echo ret2 = $?
267umask | tail -c 4
268## status: 0
269## STDOUT:
270ret0 = 0
271124
272ret1 = 0
273124
274ret2 = 0
275777
276## END
277## N-I bash/zsh STDOUT:
278ret0 = 1
279124
280ret1 = 1
281124
282ret2 = 1
283124
284## END
285
286#### umask t perm
287umask 0124
288umask a-t
289echo ret0 = $?
290umask | tail -c 4
291
292umask 0124
293umask a+t
294echo ret1 = $?
295umask | tail -c 4
296
297umask 0124
298umask a=t
299echo ret2 = $?
300umask | tail -c 4
301## status: 0
302## STDOUT:
303ret0 = 0
304124
305ret1 = 0
306124
307ret2 = 0
308777
309## END
310## N-I bash/zsh/mksh STDOUT:
311ret0 = 1
312124
313ret1 = 1
314124
315ret2 = 1
316124
317## END
318## N-I dash STDOUT:
319ret0 = 2
320124
321ret1 = 2
322124
323ret2 = 2
324124
325## END
326
327#### umask default who
328umask 0124
329umask =
330umask | tail -c 4
331
332umask 0124
333umask =rx
334echo ret = $?
335umask | tail -c 4
336
337umask 0124
338umask +
339umask | tail -c 4
340
341umask 0124
342# zsh ALSO treats this as just `umask`
343umask - >/dev/null
344umask | tail -c 4
345## status: 0
346## BUG zsh status: 1
347## STDOUT:
348777
349ret = 0
350222
351124
352124
353## END
354## BUG zsh STDOUT:
355777
356## END
357
358#### umask bare op
359umask 0124
360umask =+=
361umask | tail -c 4
362
363umask 0124
364umask +=
365umask | tail -c 4
366
367umask 0124
368umask =+rwx+rx
369umask | tail -c 4
370## status: 0
371## BUG zsh status: 1
372## STDOUT:
373777
374777
375000
376## END
377## N-I bash STDOUT:
378124
379124
380124
381## END
382## BUG zsh STDOUT:
383## END
384
385#### umask bare op -
386umask 0124
387umask -rwx
388umask | tail -c 4
389
390umask 0124
391umask -wx
392umask | tail -c 4
393
394umask 0124
395umask -=+
396umask | tail -c 4
397## status: 0
398## STDOUT:
399777
400337
401777
402## END
403## N-I dash/bash/mksh/zsh STDOUT:
404124
405124
406124
407## END
408
409#### umask permcopy
410umask 0124
411umask a=u
412umask | tail -c 4
413
414umask 0365
415umask a=g
416umask | tail -c 4
417
418umask 0124
419umask a=o
420umask | tail -c 4
421## status: 0
422## STDOUT:
423111
424666
425444
426## END
427## N-I bash/zsh STDOUT:
428124
429365
430124
431## END
432
433#### umask permcopy running value
434umask 0124
435umask a=,a=u
436umask | tail -c 4
437
438umask 0124
439umask a=
440umask a=u
441umask | tail -c 4
442## status: 0
443## STDOUT:
444111
445777
446## END
447## N-I bash/zsh STDOUT:
448124
449777
450## END
451
452#### umask sequential actions
453umask 0124
454umask u+r+w+x
455umask | tail -c 4
456
457umask 0124
458umask a+r+w+x,o-w
459umask | tail -c 4
460
461umask 0124
462umask a+x+wr-r
463umask | tail -c 4
464## status: 0
465## STDOUT:
466024
467002
468444
469## END
470## N-I bash/zsh STDOUT:
471124
472124
473124
474## END
475