1# Tests for globbing 2 3%prep 4 mkdir glob.tmp 5 mkdir glob.tmp/dir{1,2,3,4} 6 mkdir glob.tmp/dir3/subdir 7 : >glob.tmp/{,{dir1,dir2}/}{a,b,c} 8 9 globtest () { 10 $ZTST_testdir/../Src/zsh -f $ZTST_srcdir/../Misc/$1 11 } 12 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/**/*~(.)# 20 } 21 22%test 23 24 globtest globtests 250:zsh globbing 26>0: [[ foo~ = foo~ ]] 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)##) ]] 98>1: [[ f = ((^f)) ]] 99>1: [[ f = ((^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* ]] 110>1: [[ zsh = ^z* ]] 111>0: [[ a%1X = [[:alpha:][:punct:]]#[[:digit:]][^[:lower:]] ]] 112>1: [[ a%1 = [[:alpha:][:punct:]]#[[:digit:]][^[:lower:]] ]] 113>0: [[ [: = [[:]# ]] 114>0: [[ :] = []:]# ]] 115>0: [[ :] = [:]]# ]] 116>0: [[ [ = [[] ]] 117>0: [[ ] = []] ]] 118>0: [[ [] = [^]]] ]] 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 ]] 205>0 tests failed. 206 207 globtest globtests.ksh 2080:ksh compatibility 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) ]] 251>0: [[ foo = !(x) ]] 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~ = _?(*[^~]) ]] 261>0: [[ fff = !(f) ]] 262>0: [[ fff = *(!(f)) ]] 263>0: [[ fff = +(!(f)) ]] 264>0: [[ ooo = !(f) ]] 265>0: [[ ooo = *(!(f)) ]] 266>0: [[ ooo = +(!(f)) ]] 267>0: [[ foo = !(f) ]] 268>0: [[ foo = *(!(f)) ]] 269>0: [[ foo = +(!(f)) ]] 270>1: [[ f = !(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* ]] 290>0 tests failed. 291 292 (unsetopt multibyte 293 [[ bj�rn = *[������]* ]]) 2940:single byte match with top bit set 295 296 ( regress_absolute_path_and_core_dump ) 2970:exclusions regression test 298> 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 300 301 print glob.tmp/*(/) 3020:Just directories 303>glob.tmp/dir1 glob.tmp/dir2 glob.tmp/dir3 glob.tmp/dir4 304 305 print glob.tmp/*(.) 3060:Just files 307>glob.tmp/a glob.tmp/b glob.tmp/c 308 309 print glob.tmp/*(.e^'reply=( glob.tmp/*/${REPLY:t} )'^:t) 3100:Globbing used recursively (inside e glob qualifier) 311>a a b b c c 312 313 print glob.tmp/*/*(e:'reply=( glob.tmp/**/*([1]) )'::t) 3140:Recursive globbing used recursively (inside e glob qualifier) 315>a a a a a a a 316 317 print glob.tmp/**/(:h) 3180:Head modifier 319>. glob.tmp glob.tmp glob.tmp glob.tmp glob.tmp/dir3 320 321 print glob.tmp(:r) 3220:Remove extension modifier 323>glob 324 325 print glob.tmp/*(:s/./_/) 3260:Substitute modifier 327>glob_tmp/a glob_tmp/b glob_tmp/c glob_tmp/dir1 glob_tmp/dir2 glob_tmp/dir3 glob_tmp/dir4 328 329 print glob.tmp/*(F) 3300:Just full dirs 331>glob.tmp/dir1 glob.tmp/dir2 glob.tmp/dir3 332 333 print glob.tmp/*(^F) 3340:Omit full dirs 335>glob.tmp/a glob.tmp/b glob.tmp/c glob.tmp/dir4 336 337 print glob.tmp/*(/^F) 3380:Just empty dirs 339>glob.tmp/dir4 340 341 setopt extendedglob 342 print glob.tmp/**/*~*/dir3(/*|(#e))(/) 3430:Exclusions with complicated path specifications 344>glob.tmp/dir1 glob.tmp/dir2 glob.tmp/dir4 345 346 print -l -- glob.tmp/*(P:-f:) 3470:Prepending words to each argument 348>-f 349>glob.tmp/a 350>-f 351>glob.tmp/b 352>-f 353>glob.tmp/c 354>-f 355>glob.tmp/dir1 356>-f 357>glob.tmp/dir2 358>-f 359>glob.tmp/dir3 360>-f 361>glob.tmp/dir4 362 363 print -l -- glob.tmp/*(P:one word:P:another word:) 3640:Prepending two words to each argument 365>one word 366>another word 367>glob.tmp/a 368>one word 369>another word 370>glob.tmp/b 371>one word 372>another word 373>glob.tmp/c 374>one word 375>another word 376>glob.tmp/dir1 377>one word 378>another word 379>glob.tmp/dir2 380>one word 381>another word 382>glob.tmp/dir3 383>one word 384>another word 385>glob.tmp/dir4 386 387 [[ "" = "" ]] && echo OK 3880:Empty strings 389>OK 390 391 foo="this string has a : colon in it" 392 print ${foo%% #:*} 3930:Must-match arguments in complex patterns 394>this string has a 395 396 mkdir glob.tmp/ra=1.0_et=3.5 397 touch glob.tmp/ra=1.0_et=3.5/foo 398 print glob.tmp/ra=1.0_et=3.5/??? 3990:Bug with intermediate paths with plain strings but tokenized characters 400>glob.tmp/ra=1.0_et=3.5/foo 401 402 doesmatch() { 403 setopt localoptions extendedglob 404 print -n $1 $2\ 405 if [[ $1 = $~2 ]]; then print yes; else print no; fi; 406 } 407 doesmatch MY_IDENTIFIER '[[:IDENT:]]##' 408 doesmatch YOUR:IDENTIFIER '[[:IDENT:]]##' 409 IFS=$'\n' doesmatch $'\n' '[[:IFS:]]' 410 IFS=' ' doesmatch $'\n' '[[:IFS:]]' 411 IFS=':' doesmatch : '[[:IFSSPACE:]]' 412 IFS=' ' doesmatch ' ' '[[:IFSSPACE:]]' 413 WORDCHARS="" doesmatch / '[[:WORD:]]' 414 WORDCHARS="/" doesmatch / '[[:WORD:]]' 4150:Named character sets handled internally 416>MY_IDENTIFIER [[:IDENT:]]## yes 417>YOUR:IDENTIFIER [[:IDENT:]]## no 418> 419> [[:IFS:]] yes 420> 421> [[:IFS:]] no 422>: [[:IFSSPACE:]] no 423> [[:IFSSPACE:]] yes 424>/ [[:WORD:]] no 425>/ [[:WORD:]] yes 426 427 [[ foo = (#c0)foo ]] 4282:Misplaced (#c...) flag 429?(eval):1: bad pattern: (#c0)foo 430 431 mkdir glob.tmp/dir5 432 touch glob.tmp/dir5/N123 433 print glob.tmp/dir5/N<->(N) 4340:Numeric glob is not usurped by process substitution. 435>glob.tmp/dir5/N123 436 437 tpd() { 438 [[ $1 = $~2 ]] 439 print -r "$1, $2: $?" 440 } 441 test_pattern_disables() { 442 emulate -L zsh 443 tpd 'forthcoming' 'f*g' 444 disable -p '*' 445 tpd 'forthcoming' 'f*g' 446 tpd 'f*g' 'f*g' 447 tpd '[frog]' '[frog]' 448 tpd '[frog]' '\[[f]rog\]' 449 disable -p '[' 450 tpd '[frog]' '[frog]' 451 tpd '[frog]' '\[[f]rog\]' 452 setopt extendedglob 453 tpd 'foo' '^bar' 454 disable -p '^' 455 tpd 'foo' '^bar' 456 tpd '^bar' '^bar' 457 tpd 'rumble' '(rumble|bluster)' 458 tpd '(thunder)' '(thunder)' 459 disable -p '(' 460 tpd 'rumble' '(rumble|bluster)' 461 tpd '(thunder)' '(thunder)' 462 setopt kshglob 463 tpd 'scramble' '@(panic|frenzy|scramble)' 464 tpd '@(scrimf)' '@(scrimf)' 465 disable -p '@(' 466 tpd 'scramble' '@(panic|frenzy|scramble)' 467 tpd '@(scrimf)' '@(scrimf)' 468 disable -p 469 } 470 test_pattern_disables 471 print Nothing should be disabled. 472 disable -p 4730:disable -p 474>forthcoming, f*g: 0 475>forthcoming, f*g: 1 476>f*g, f*g: 0 477>[frog], [frog]: 1 478>[frog], \[[f]rog\]: 0 479>[frog], [frog]: 0 480>[frog], \[[f]rog\]: 1 481>foo, ^bar: 0 482>foo, ^bar: 1 483>^bar, ^bar: 0 484>rumble, (rumble|bluster): 0 485>(thunder), (thunder): 1 486>rumble, (rumble|bluster): 1 487>(thunder), (thunder): 0 488>scramble, @(panic|frenzy|scramble): 0 489>@(scrimf), @(scrimf): 1 490>scramble, @(panic|frenzy|scramble): 1 491>@(scrimf), @(scrimf): 0 492>'(' '*' '[' '^' '@(' 493>Nothing should be disabled. 494 495 ( 496 setopt nomatch 497 x=( '' ) 498 print $^x(N) 499 ) 5000:No error with empty null glob with (N). 501> 502 503 (setopt kshglob 504 test_array=( 505 '+fours' '+*' 506 '@titude' '@*' 507 '!bang' '!*' 508 # and check they work in the real kshglob cases too... 509 '+bus+bus' '+(+bus|-car)' 510 '@sinhats' '@(@sinhats|wrensinfens)' 511 '!kerror' '!(!somethingelse)' 512 # and these don't match, to be sure 513 '+more' '+(+less)' 514 '@all@all' '@(@all)' 515 '!goesitall' '!(!goesitall)' 516 ) 517 for str pat in $test_array; do 518 eval "[[ $str = $pat ]]" && print "$str matches $pat" 519 done 520 true 521 ) 5220:kshglob option does not break +, @, ! without following open parenthesis 523>+fours matches +* 524>@titude matches @* 525>!bang matches !* 526>+bus+bus matches +(+bus|-car) 527>@sinhats matches @(@sinhats|wrensinfens) 528>!kerror matches !(!somethingelse) 529