5 mkdir glob.tmp/dir{1,2,3,4}
6 mkdir glob.tmp/dir3/subdir
7 : >glob.tmp/{,{dir1,dir2}/}{a,b,c}
10 $ZTST_testdir/../Src/zsh -f $ZTST_srcdir/../Misc/$1
13 regress_absolute_path_and_core_dump() {
14 local absolute_dir=$(cd glob.tmp && pwd -P)
15 [[ -n $absolute_dir ]] || return 1
16 setopt localoptions extendedglob nullglob
17 print $absolute_dir/**/*~/*
18 setopt nonullglob nomatch
19 print glob.tmp/**/*~(.)#
27 >0: [[ foo~ = (foo~) ]]
28 >0: [[ foo~ = (foo~|) ]]
29 >0: [[ foo.c = *.c~boo* ]]
30 >1: [[ foo.c = *.c~boo*~foo* ]]
31 >0: [[ fofo = (fo#)# ]]
32 >0: [[ ffo = (fo#)# ]]
33 >0: [[ foooofo = (fo#)# ]]
34 >0: [[ foooofof = (fo#)# ]]
35 >0: [[ fooofoofofooo = (fo#)# ]]
36 >1: [[ foooofof = (fo##)# ]]
37 >1: [[ xfoooofof = (fo#)# ]]
38 >1: [[ foooofofx = (fo#)# ]]
39 >0: [[ ofxoofxo = ((ofo#x)#o)# ]]
40 >1: [[ ofooofoofofooo = (fo#)# ]]
41 >0: [[ foooxfooxfoxfooox = (fo#x)# ]]
42 >1: [[ foooxfooxofoxfooox = (fo#x)# ]]
43 >0: [[ foooxfooxfxfooox = (fo#x)# ]]
44 >0: [[ ofxoofxo = ((ofo#x)#o)# ]]
45 >0: [[ ofoooxoofxo = ((ofo#x)#o)# ]]
46 >0: [[ ofoooxoofxoofoooxoofxo = ((ofo#x)#o)# ]]
47 >0: [[ ofoooxoofxoofoooxoofxoo = ((ofo#x)#o)# ]]
48 >1: [[ ofoooxoofxoofoooxoofxofo = ((ofo#x)#o)# ]]
49 >0: [[ ofoooxoofxoofoooxoofxooofxofxo = ((ofo#x)#o)# ]]
50 >0: [[ aac = ((a))#a(c) ]]
51 >0: [[ ac = ((a))#a(c) ]]
52 >1: [[ c = ((a))#a(c) ]]
53 >0: [[ aaac = ((a))#a(c) ]]
54 >1: [[ baaac = ((a))#a(c) ]]
55 >0: [[ abcd = ?(a|b)c#d ]]
56 >0: [[ abcd = (ab|ab#)c#d ]]
57 >0: [[ acd = (ab|ab#)c#d ]]
58 >0: [[ abbcd = (ab|ab#)c#d ]]
59 >0: [[ effgz = (bc##d|ef#g?|(h|)i(j|k)) ]]
60 >0: [[ efgz = (bc##d|ef#g?|(h|)i(j|k)) ]]
61 >0: [[ egz = (bc##d|ef#g?|(h|)i(j|k)) ]]
62 >0: [[ egzefffgzbcdij = (bc##d|ef#g?|(h|)i(j|k))# ]]
63 >1: [[ egz = (bc##d|ef##g?|(h|)i(j|k)) ]]
64 >0: [[ ofoofo = (ofo##)# ]]
65 >0: [[ oxfoxoxfox = (oxf(ox)##)# ]]
66 >1: [[ oxfoxfox = (oxf(ox)##)# ]]
67 >0: [[ ofoofo = (ofo##|f)# ]]
68 >0: [[ foofoofo = (foo|f|fo)(f|ofo##)# ]]
69 >0: [[ oofooofo = (of|oofo##)# ]]
70 >0: [[ fffooofoooooffoofffooofff = (f#o#)# ]]
71 >1: [[ fffooofoooooffoofffooofffx = (f#o#)# ]]
72 >0: [[ fofoofoofofoo = (fo|foo)# ]]
73 >0: [[ foo = ((^x)) ]]
74 >0: [[ foo = ((^x)*) ]]
75 >1: [[ foo = ((^foo)) ]]
76 >0: [[ foo = ((^foo)*) ]]
77 >0: [[ foobar = ((^foo)) ]]
78 >0: [[ foobar = ((^foo)*) ]]
79 >1: [[ foot = z*~*x ]]
80 >0: [[ zoot = z*~*x ]]
81 >1: [[ foox = z*~*x ]]
82 >1: [[ zoox = z*~*x ]]
83 >0: [[ moo.cow = (*~*.*).(*~*.*) ]]
84 >1: [[ mad.moo.cow = (*~*.*).(*~*.*) ]]
85 >0: [[ moo.cow = (^*.*).(^*.*) ]]
86 >1: [[ sane.moo.cow = (^*.*).(^*.*) ]]
87 >1: [[ mucca.pazza = mu(^c#)?.pa(^z#)? ]]
88 >1: [[ _foo~ = _(|*[^~]) ]]
89 >0: [[ fff = ((^f)) ]]
90 >0: [[ fff = ((^f)#) ]]
91 >0: [[ fff = ((^f)##) ]]
92 >0: [[ ooo = ((^f)) ]]
93 >0: [[ ooo = ((^f)#) ]]
94 >0: [[ ooo = ((^f)##) ]]
95 >0: [[ foo = ((^f)) ]]
96 >0: [[ foo = ((^f)#) ]]
97 >0: [[ foo = ((^f)##) ]]
100 >1: [[ f = ((^f)##) ]]
101 >0: [[ foot = (^z*|*x) ]]
102 >1: [[ zoot = (^z*|*x) ]]
103 >0: [[ foox = (^z*|*x) ]]
104 >0: [[ zoox = (^z*|*x) ]]
105 >0: [[ foo = (^foo)# ]]
106 >1: [[ foob = (^foo)b* ]]
107 >0: [[ foobb = (^foo)b* ]]
108 >1: [[ foob = (*~foo)b* ]]
109 >0: [[ foobb = (*~foo)b* ]]
111 >0: [[ a%1X = [[:alpha:][:punct:]]#[[:digit:]][^[:lower:]] ]]
112 >1: [[ a%1 = [[:alpha:][:punct:]]#[[:digit:]][^[:lower:]] ]]
119 >0: [[ fooxx = (#i)FOOXX ]]
120 >1: [[ fooxx = (#l)FOOXX ]]
121 >0: [[ FOOXX = (#l)fooxx ]]
122 >1: [[ fooxx = (#i)FOO(#I)X(#i)X ]]
123 >0: [[ fooXx = (#i)FOO(#I)X(#i)X ]]
124 >0: [[ fooxx = ((#i)FOOX)x ]]
125 >1: [[ fooxx = ((#i)FOOX)X ]]
126 >1: [[ BAR = (bar|(#i)foo) ]]
127 >0: [[ FOO = (bar|(#i)foo) ]]
128 >0: [[ Modules = (#i)*m* ]]
129 >0: [[ fooGRUD = (#i)(bar|(#I)foo|(#i)rod)grud ]]
130 >1: [[ FOOGRUD = (#i)(bar|(#I)foo|(#i)rod)grud ]]
131 >0: [[ readme = (#i)readme~README|readme ]]
132 >0: [[ readme = (#i)readme~README|readme~README ]]
133 >0: [[ 633 = <1-1000>33 ]]
134 >0: [[ 633 = <-1000>33 ]]
135 >0: [[ 633 = <1->33 ]]
136 >0: [[ 633 = <->33 ]]
137 >0: [[ 12345678901234567890123456789012345678901234567890123456789012345678901234567890foo = <42->foo ]]
138 >0: [[ READ.ME = (#ia1)readme ]]
139 >1: [[ READ..ME = (#ia1)readme ]]
140 >0: [[ README = (#ia1)readm ]]
141 >0: [[ READM = (#ia1)readme ]]
142 >0: [[ README = (#ia1)eadme ]]
143 >0: [[ EADME = (#ia1)readme ]]
144 >0: [[ READEM = (#ia1)readme ]]
145 >1: [[ ADME = (#ia1)readme ]]
146 >1: [[ README = (#ia1)read ]]
147 >0: [[ bob = (#a1)[b][b] ]]
148 >1: [[ bob = (#a1)[b][b]a ]]
149 >0: [[ bob = (#a1)[b]o[b]a ]]
150 >1: [[ bob = (#a1)[c]o[b] ]]
151 >0: [[ abcd = (#a2)XbcX ]]
152 >0: [[ abcd = (#a2)ad ]]
153 >0: [[ ad = (#a2)abcd ]]
154 >0: [[ abcd = (#a2)bd ]]
155 >0: [[ bd = (#a2)abcd ]]
156 >0: [[ badc = (#a2)abcd ]]
157 >0: [[ adbc = (#a2)abcd ]]
158 >1: [[ dcba = (#a2)abcd ]]
159 >0: [[ dcba = (#a3)abcd ]]
160 >0: [[ aabaXaaabY = (#a1)(a#b)#Y ]]
161 >0: [[ aabaXaaabY = (#a1)(a#b)(a#b)Y ]]
162 >0: [[ aaXaaaaabY = (#a1)(a#b)(a#b)Y ]]
163 >0: [[ aaaXaaabY = (#a1)(a##b)##Y ]]
164 >0: [[ aaaXbaabY = (#a1)(a##b)##Y ]]
165 >1: [[ read.me = (#ia1)README~READ.ME ]]
166 >0: [[ read.me = (#ia1)README~READ_ME ]]
167 >1: [[ read.me = (#ia1)README~(#a1)READ_ME ]]
168 >0: [[ test = *((#s)|/)test((#e)|/)* ]]
169 >0: [[ test/path = *((#s)|/)test((#e)|/)* ]]
170 >0: [[ path/test = *((#s)|/)test((#e)|/)* ]]
171 >0: [[ path/test/ohyes = *((#s)|/)test((#e)|/)* ]]
172 >1: [[ atest = *((#s)|/)test((#e)|/)* ]]
173 >1: [[ testy = *((#s)|/)test((#e)|/)* ]]
174 >1: [[ testy/path = *((#s)|/)test((#e)|/)* ]]
175 >1: [[ path/atest = *((#s)|/)test((#e)|/)* ]]
176 >1: [[ atest/path = *((#s)|/)test((#e)|/)* ]]
177 >1: [[ path/testy = *((#s)|/)test((#e)|/)* ]]
178 >1: [[ path/testy/ohyes = *((#s)|/)test((#e)|/)* ]]
179 >1: [[ path/atest/ohyes = *((#s)|/)test((#e)|/)* ]]
180 >0: [[ XabcdabcY = X(ab|c|d)(#c5)Y ]]
181 >0: [[ XabcdabcY = X(ab|c|d)(#c1,5)Y ]]
182 >0: [[ XabcdabcY = X(ab|c|d)(#c5,8)Y ]]
183 >0: [[ XabcdabcY = X(ab|c|d)(#c4,)Y ]]
184 >1: [[ XabcdabcY = X(ab|c|d)(#c6,)Y ]]
185 >1: [[ XabcdabcY = X(ab|c|d)(#c1,4)Y ]]
186 >0: [[ ZX = Z(|)(#c1)X ]]
187 >0: [[ froofroo = (fro(#c2))(#c2) ]]
188 >1: [[ froofroofroo = (fro(#c2))(#c2) ]]
189 >1: [[ froofro = (fro(#c2))(#c2) ]]
190 >0: [[ ax = ?(#c1,2)x ]]
191 >0: [[ ax = ?(#c1,)x ]]
192 >0: [[ ax = ?(#c0,1)x ]]
193 >1: [[ ax = ?(#c0,0)x ]]
194 >1: [[ ax = ?(#c2,)x ]]
195 >0: [[ aa = a(#c1,2)a ]]
196 >0: [[ aa = a(#c1,)a ]]
197 >0: [[ aa = a(#c0,1)a ]]
198 >1: [[ aa = a(#c0,0)a ]]
199 >1: [[ aa = a(#c2,)a ]]
200 >0: [[ test.zsh = *.?(#c1)sh ]]
201 >0: [[ test.bash = *.?(#c2)sh ]]
202 >0: [[ test.bash = *.?(#c1,2)sh ]]
203 >0: [[ test.bash = *.?(#c1,)sh ]]
204 >0: [[ test.zsh = *.?(#c1,)sh ]]
207 globtest globtests.ksh
209 >0: [[ fofo = *(f*(o)) ]]
210 >0: [[ ffo = *(f*(o)) ]]
211 >0: [[ foooofo = *(f*(o)) ]]
212 >0: [[ foooofof = *(f*(o)) ]]
213 >0: [[ fooofoofofooo = *(f*(o)) ]]
214 >1: [[ foooofof = *(f+(o)) ]]
215 >1: [[ xfoooofof = *(f*(o)) ]]
216 >1: [[ foooofofx = *(f*(o)) ]]
217 >0: [[ ofxoofxo = *(*(of*(o)x)o) ]]
218 >1: [[ ofooofoofofooo = *(f*(o)) ]]
219 >0: [[ foooxfooxfoxfooox = *(f*(o)x) ]]
220 >1: [[ foooxfooxofoxfooox = *(f*(o)x) ]]
221 >0: [[ foooxfooxfxfooox = *(f*(o)x) ]]
222 >0: [[ ofxoofxo = *(*(of*(o)x)o) ]]
223 >0: [[ ofoooxoofxo = *(*(of*(o)x)o) ]]
224 >0: [[ ofoooxoofxoofoooxoofxo = *(*(of*(o)x)o) ]]
225 >0: [[ ofoooxoofxoofoooxoofxoo = *(*(of*(o)x)o) ]]
226 >1: [[ ofoooxoofxoofoooxoofxofo = *(*(of*(o)x)o) ]]
227 >0: [[ ofoooxoofxoofoooxoofxooofxofxo = *(*(of*(o)x)o) ]]
228 >0: [[ aac = *(@(a))a@(c) ]]
229 >0: [[ ac = *(@(a))a@(c) ]]
230 >1: [[ c = *(@(a))a@(c) ]]
231 >0: [[ aaac = *(@(a))a@(c) ]]
232 >1: [[ baaac = *(@(a))a@(c) ]]
233 >0: [[ abcd = ?@(a|b)*@(c)d ]]
234 >0: [[ abcd = @(ab|a*@(b))*(c)d ]]
235 >0: [[ acd = @(ab|a*(b))*(c)d ]]
236 >0: [[ abbcd = @(ab|a*(b))*(c)d ]]
237 >0: [[ effgz = @(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
238 >0: [[ efgz = @(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
239 >0: [[ egz = @(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
240 >0: [[ egzefffgzbcdij = *(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
241 >1: [[ egz = @(b+(c)d|e+(f)g?|?(h)i@(j|k)) ]]
242 >0: [[ ofoofo = *(of+(o)) ]]
243 >0: [[ oxfoxoxfox = *(oxf+(ox)) ]]
244 >1: [[ oxfoxfox = *(oxf+(ox)) ]]
245 >0: [[ ofoofo = *(of+(o)|f) ]]
246 >0: [[ foofoofo = @(foo|f|fo)*(f|of+(o)) ]]
247 >0: [[ oofooofo = *(of|oof+(o)) ]]
248 >0: [[ fffooofoooooffoofffooofff = *(*(f)*(o)) ]]
249 >1: [[ fffooofoooooffoofffooofffx = *(*(f)*(o)) ]]
250 >0: [[ fofoofoofofoo = *(fo|foo) ]]
252 >0: [[ foo = !(x)* ]]
253 >1: [[ foo = !(foo) ]]
254 >0: [[ foo = !(foo)* ]]
255 >0: [[ foobar = !(foo) ]]
256 >0: [[ foobar = !(foo)* ]]
257 >0: [[ moo.cow = !(*.*).!(*.*) ]]
258 >1: [[ mad.moo.cow = !(*.*).!(*.*) ]]
259 >1: [[ mucca.pazza = mu!(*(c))?.pa!(*(z))? ]]
260 >1: [[ _foo~ = _?(*[^~]) ]]
262 >0: [[ fff = *(!(f)) ]]
263 >0: [[ fff = +(!(f)) ]]
265 >0: [[ ooo = *(!(f)) ]]
266 >0: [[ ooo = +(!(f)) ]]
268 >0: [[ foo = *(!(f)) ]]
269 >0: [[ foo = +(!(f)) ]]
271 >1: [[ f = *(!(f)) ]]
272 >1: [[ f = +(!(f)) ]]
273 >0: [[ foot = @(!(z*)|*x) ]]
274 >1: [[ zoot = @(!(z*)|*x) ]]
275 >0: [[ foox = @(!(z*)|*x) ]]
276 >0: [[ zoox = @(!(z*)|*x) ]]
277 >0: [[ foo = *(!(foo)) ]]
278 >1: [[ foob = !(foo)b* ]]
279 >0: [[ foobb = !(foo)b* ]]
280 >0: [[ fooxx = (#i)FOOXX ]]
281 >1: [[ fooxx = (#l)FOOXX ]]
282 >0: [[ FOOXX = (#l)fooxx ]]
283 >1: [[ fooxx = (#i)FOO@(#I)X@(#i)X ]]
284 >0: [[ fooXx = (#i)FOO@(#I)X@(#i)X ]]
285 >0: [[ fooxx = @((#i)FOOX)x ]]
286 >1: [[ fooxx = @((#i)FOOX)X ]]
287 >1: [[ BAR = @(bar|(#i)foo) ]]
288 >0: [[ FOO = @(bar|(#i)foo) ]]
289 >0: [[ Modules = (#i)*m* ]]
293 [[ björn = *[åäöÅÄÖ]* ]])
294 0:single byte match with top bit set
296 ( regress_absolute_path_and_core_dump )
297 0:exclusions regression test
299 >glob.tmp/a glob.tmp/b glob.tmp/c glob.tmp/dir1 glob.tmp/dir1/a glob.tmp/dir1/b glob.tmp/dir1/c glob.tmp/dir2 glob.tmp/dir2/a glob.tmp/dir2/b glob.tmp/dir2/c glob.tmp/dir3 glob.tmp/dir3/subdir glob.tmp/dir4
303 >glob.tmp/dir1 glob.tmp/dir2 glob.tmp/dir3 glob.tmp/dir4
307 >glob.tmp/a glob.tmp/b glob.tmp/c
309 print glob.tmp/*(.e^'reply=( glob.tmp/*/${REPLY:t} )'^:t)
310 0:Globbing used recursively (inside e glob qualifier)
313 print glob.tmp/*/*(e:'reply=( glob.tmp/**/*([1]) )'::t)
314 0:Recursive globbing used recursively (inside e glob qualifier)
317 print glob.tmp/**/(:h)
319 >. glob.tmp glob.tmp glob.tmp glob.tmp glob.tmp/dir3
322 0:Remove extension modifier
325 print glob.tmp/*(:s/./_/)
326 0:Substitute modifier
327 >glob_tmp/a glob_tmp/b glob_tmp/c glob_tmp/dir1 glob_tmp/dir2 glob_tmp/dir3 glob_tmp/dir4
331 >glob.tmp/dir1 glob.tmp/dir2 glob.tmp/dir3
335 >glob.tmp/a glob.tmp/b glob.tmp/c glob.tmp/dir4
337 print glob.tmp/*(/^F)
342 print glob.tmp/**/*~*/dir3(/*|(#e))(/)
343 0:Exclusions with complicated path specifications
344 >glob.tmp/dir1 glob.tmp/dir2 glob.tmp/dir4
346 [[ "" = "" ]] && echo OK
350 foo="this string has a : colon in it"
352 0:Must-match arguments in complex patterns
355 mkdir glob.tmp/ra=1.0_et=3.5
356 touch glob.tmp/ra=1.0_et=3.5/foo
357 print glob.tmp/ra=1.0_et=3.5/???
358 0:Bug with intermediate paths with plain strings but tokenized characters
359 >glob.tmp/ra=1.0_et=3.5/foo
362 setopt localoptions extendedglob
364 if [[ $1 = $~2 ]]; then print yes; else print no; fi;
366 doesmatch MY_IDENTIFIER '[[:IDENT:]]##'
367 doesmatch YOUR:IDENTIFIER '[[:IDENT:]]##'
368 IFS=$'\n' doesmatch $'\n' '[[:IFS:]]'
369 IFS=' ' doesmatch $'\n' '[[:IFS:]]'
370 IFS=':' doesmatch : '[[:IFSSPACE:]]'
371 IFS=' ' doesmatch ' ' '[[:IFSSPACE:]]'
372 WORDCHARS="" doesmatch / '[[:WORD:]]'
373 WORDCHARS="/" doesmatch / '[[:WORD:]]'
374 0:Named character sets handled internally
375 >MY_IDENTIFIER [[:IDENT:]]## yes
376 >YOUR:IDENTIFIER [[:IDENT:]]## no
387 1:Misplaced (#c...) flag
388 ?(eval):1: bad pattern: (#c0)foo
391 touch glob.tmp/dir5/N123
392 print glob.tmp/dir5/N<->(N)
393 0:Numeric glob is not usurped by process substitution.