| status | bash | mksh | ksh | toysh | sush | brush | osh | |
| pass | 29 | 22 | 26 | 1 | 23 | 28 | 25 | |
| ok | 0 | 1 | 0 | 0 | 0 | 0 | 3 | |
| N-I | 0 | 2 | 0 | 0 | 0 | 0 | 1 | |
| BUG | 0 | 4 | 0 | 0 | 0 | 0 | 0 | |
| FAIL | 0 | 0 | 3 | 28 | 6 | 1 | 0 | |
| total | 29 | 29 | 29 | 29 | 29 | 29 | 29 | |
| case | bash | mksh | ksh | toysh | sush | brush | osh | description |
| 0 | pass | pass | pass | FAIL | pass | pass | pass | @ matches exactly one |
| details | ||||||||
| 1 | pass | pass | pass | FAIL | pass | pass | pass | @() with variable arms |
| details | ||||||||
| 2 | pass | N-I | pass | FAIL | pass | pass | ok | extglob in variable |
| details | details | details | ||||||
| 3 | pass | pass | pass | FAIL | FAIL | pass | pass | Matching literal '@(cc)' |
| details | details | |||||||
| 4 | pass | BUG | pass | FAIL | pass | pass | pass | nested @() |
| details | details | |||||||
| 5 | pass | pass | pass | FAIL | FAIL | pass | pass | nested @() with quotes and vars |
| details | details | |||||||
| 6 | pass | pass | pass | FAIL | pass | pass | pass | ? matches 0 or 1 |
| details | ||||||||
| 7 | pass | pass | pass | FAIL | pass | pass | pass | + matches 1 or more |
| details | ||||||||
| 8 | pass | pass | pass | FAIL | pass | pass | pass | * matches 0 or more |
| details | ||||||||
| 9 | pass | pass | pass | FAIL | pass | pass | pass | simple repetition with *(foo) and +(Foo) |
| details | ||||||||
| 10 | pass | pass | pass | FAIL | pass | pass | pass | ! matches none |
| details | ||||||||
| 11 | pass | pass | pass | FAIL | pass | pass | pass | match is anchored |
| details | ||||||||
| 12 | pass | pass | pass | FAIL | pass | pass | pass | repeated match is anchored |
| details | ||||||||
| 13 | pass | pass | pass | FAIL | pass | pass | pass | repetition with glob |
| details | ||||||||
| 14 | pass | pass | pass | FAIL | pass | pass | pass | No brace expansion in == |
| details | ||||||||
| 15 | pass | pass | pass | FAIL | pass | pass | pass | adjacent extglob |
| details | ||||||||
| 16 | pass | pass | pass | FAIL | pass | pass | pass | nested extglob |
| details | ||||||||
| 17 | pass | pass | pass | FAIL | pass | pass | pass | extglob empty string |
| details | ||||||||
| 18 | pass | pass | pass | FAIL | pass | pass | pass | extglob empty pattern |
| details | ||||||||
| 19 | pass | pass | pass | FAIL | FAIL | pass | pass | case with extglob |
| details | details | |||||||
| 20 | pass | pass | pass | FAIL | FAIL | pass | pass | [[ $x == !($str) ]] |
| details | details | |||||||
| 21 | pass | ok | FAIL | FAIL | FAIL | FAIL | ok | Turning extglob on changes the meaning of [[ !(str) ]] in bash |
| details | details | details | details | details | details | |||
| 22 | pass | pass | pass | FAIL | FAIL | pass | pass | With extglob on, !($str) on the left or right of == has different meanings |
| details | details | |||||||
| 23 | pass | BUG | FAIL | FAIL | pass | pass | ok | extglob inside arg word |
| details | details | details | details | |||||
| 24 | pass | N-I | FAIL | pass | pass | pass | pass | extglob is not detected in regex! |
| details | details | |||||||
| 25 | pass | BUG | pass | FAIL | pass | pass | pass | regular glob of single unicode char |
| details | details | |||||||
| 26 | pass | BUG | pass | FAIL | pass | pass | pass | extended glob of single unicode char |
| details | details | |||||||
| 27 | pass | pass | pass | FAIL | pass | pass | N-I | Extended glob in ${x//pat/replace} |
| details | details | |||||||
| 28 | pass | pass | pass | FAIL | pass | pass | pass | Extended glob in ${x%PATTERN} |
| details |
154 passed, 4 OK, 3 not implemented, 4 BUG, 38 failed, 0 timeouts, 0 cases skipped
| toysh | 0 @ matches exactly one [toysh stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| toysh | 1 @() with variable arms [toysh stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| mksh | 2 extglob in variable stdout: FALSE FALSE FALSEstderr: mksh: <stdin>[1]: shopt: not found |
| toysh | 2 extglob in variable [toysh stdout] Expected 'TRUE\nTRUE\nFALSE\nFALSE\nFALSE\n', got 'FALSE\nFALSE\nFALSE\n' stdout: FALSE FALSE FALSEstderr: sh: shopt: No such file or directory [[: too many arguments [[: too many arguments |
| osh | 2 extglob in variable stdout: stderr: g=--@(help|verbose)
^~
[ stdin ]:3: fatal: extended glob not allowed in this word
|
| toysh | 3 Matching literal '@(cc)' [toysh stdout] Expected 'status=0\nstatus=1\nstatus=0\nstatus=1\n', got 'status=1\nstatus=1\nstatus=1\nstatus=1\n' stdout: status=1 status=1 status=1 status=1stderr: sh: shopt: No such file or directory |
| sush | 3 Matching literal '@(cc)' [sush stdout] Expected 'status=0\nstatus=1\nstatus=0\nstatus=1\n', got 'status=0\nstatus=0\nstatus=0\nstatus=0\n' stdout: status=0 status=0 status=0 status=0stderr: |
| mksh | 4 nested @() stdout: FALSEstderr: mksh: <stdin>[1]: shopt: not found |
| toysh | 4 nested @() [toysh stdout] Expected 'TRUE\nTRUE\nTRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| toysh | 5 nested @() with quotes and vars [toysh stdout] Expected 'TRUE\n', got '' [toysh status] Expected 0, got 1 stdout: stderr: sh: shopt: No such file or directory |
| sush | 5 nested @() with quotes and vars [sush stdout] Expected 'TRUE\n', got '' [sush status] Expected 0, got 1 stdout: stderr: |
| toysh | 6 ? matches 0 or 1 [toysh stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| toysh | 7 + matches 1 or more [toysh stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| toysh | 8 * matches 0 or more [toysh stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| toysh | 9 simple repetition with *(foo) and +(Foo) [toysh stdout] Expected 'TRUE\nTRUE\n', got '' [toysh status] Expected 0, got 1 stdout: stderr: sh: shopt: No such file or directory |
| toysh | 10 ! matches none [toysh stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| toysh | 11 match is anchored [toysh stdout] Expected 'FALSE\nFALSE\nTRUE\n', got 'FALSE\nFALSE\n' [toysh status] Expected 0, got 1 stdout: FALSE FALSEstderr: sh: shopt: No such file or directory |
| toysh | 12 repeated match is anchored [toysh stdout] Expected 'FALSE\nFALSE\nTRUE\n', got 'FALSE\nFALSE\n' [toysh status] Expected 0, got 1 stdout: FALSE FALSEstderr: sh: shopt: No such file or directory |
| toysh | 13 repetition with glob [toysh stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| toysh | 14 No brace expansion in == [toysh stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory [[: too many arguments |
| toysh | 15 adjacent extglob [toysh stdout] Expected 'TRUE\nTRUE\n', got '' [toysh status] Expected 0, got 1 stdout: stderr: sh: shopt: No such file or directory |
| toysh | 16 nested extglob [toysh stdout] Expected 'TRUE\nTRUE\nTRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| toysh | 17 extglob empty string [toysh stdout] Expected 'FALSE\nTRUE\n', got 'FALSE\n' [toysh status] Expected 0, got 1 stdout: FALSEstderr: sh: shopt: No such file or directory |
| toysh | 18 extglob empty pattern [toysh stdout] Expected 'TRUE\nTRUE\nFALSE\nFALSE\n', got 'FALSE\nFALSE\n' stdout: FALSE FALSEstderr: sh: shopt: No such file or directory |
| toysh | 19 case with extglob [toysh stdout] Expected 'A\nA\nU\nB\nC\nD\n', got 'U\n' [toysh status] Expected 0, got -6 stdout: Ustderr: sh: shopt: No such file or directory free(): invalid pointer |
| sush | 19 case with extglob [sush stdout] Expected 'A\nA\nU\nB\nC\nD\n', got 'A\nU\nC\n' stdout: A U Cstderr: |
| toysh | 20 [[ $x == !($str) ]] [toysh stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory [[: too many arguments |
| sush | 20 [[ $x == !($str) ]] [sush stdout] Expected 'TRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: |
| mksh | 21 Turning extglob on changes the meaning of [[ !(str) ]] in bash stdout: TRUE TRUE TRUEstderr: mksh: <stdin>[5]: shopt: not found |
| ksh | 21 Turning extglob on changes the meaning of [[ !(str) ]] in bash [ksh stdout] Expected 'TRUE\nFALSE\nTRUE\nTRUE\n', got 'TRUE\nTRUE\nTRUE\n' stdout: TRUE TRUE TRUEstderr: E: ksh: <stdin>[5]: shopt: inaccessible or not found |
| toysh | 21 Turning extglob on changes the meaning of [[ !(str) ]] in bash [toysh stdout] Expected 'TRUE\nFALSE\nTRUE\nTRUE\n', got 'TRUE\nTRUE\nTRUE\n' stdout: TRUE TRUE TRUEstderr: sh: shopt: No such file or directory |
| sush | 21 Turning extglob on changes the meaning of [[ !(str) ]] in bash [sush stdout] Expected 'TRUE\nFALSE\nTRUE\nTRUE\n', got 'TRUE\nFALSE\nTRUE\n' [sush status] Expected 0, got 1 stdout: TRUE FALSE TRUEstderr: |
| brush | 21 Turning extglob on changes the meaning of [[ !(str) ]] in bash [brush stdout] Expected 'TRUE\nFALSE\nTRUE\nTRUE\n', got 'TRUE\nTRUE\nTRUE\n' stdout: TRUE TRUE TRUEstderr: |
| osh | 21 Turning extglob on changes the meaning of [[ !(str) ]] in bash stdout: stderr: [[ !($empty) ]] && echo TRUE # test if $empty is empty
^~
[ stdin ]:3: fatal: extended glob not allowed in this word
|
| toysh | 22 With extglob on, !($str) on the left or right of == has different meanings [toysh stdout] Expected 'TRUE\n', got '' [toysh status] Expected 0, got 1 stdout: stderr: sh: shopt: No such file or directory |
| sush | 22 With extglob on, !($str) on the left or right of == has different meanings [sush stdout] Expected 'TRUE\n', got '' [sush status] Expected 0, got 2 stdout: stderr: |
| mksh | 23 extglob inside arg word stdout: TRUE FALSEstderr: mksh: <stdin>[1]: shopt: not found |
| ksh | 23 extglob inside arg word [ksh stdout] Expected 'TRUE\nTRUE\nFALSE\n', got 'TRUE\nFALSE\n' stdout: TRUE FALSEstderr: E: ksh: <stdin>[1]: shopt: inaccessible or not found |
| toysh | 23 extglob inside arg word [toysh stdout] Expected 'TRUE\nTRUE\nFALSE\n', got 'FALSE\n' stdout: FALSEstderr: sh: shopt: No such file or directory |
| osh | 23 extglob inside arg word stdout: TRUEstderr: [[ foo == ${unset:-@(foo|bar)} ]] && echo TRUE
^~
[ stdin ]:3: fatal: Extended glob not allowed in this word
|
| mksh | 24 extglob is not detected in regex! stdout: stderr: mksh: <stdin>[1]: shopt: not found mksh: <stdin>[2]: syntax error: '=~' unexpected operator/operand |
| ksh | 24 extglob is not detected in regex! [ksh stdout] Expected 'FALSE\n', got '' [ksh status] Expected 0, got 1 stdout: stderr: E: ksh: <stdin>[1]: shopt: inaccessible or not found E: ksh: <stdin>[2]: syntax error: unexpected operator/operand '=~' |
| mksh | 25 regular glob of single unicode char stdout: 0 1stderr: mksh: <stdin>[1]: shopt: not found |
| toysh | 25 regular glob of single unicode char [toysh stdout] Expected '0\n0\n', got '1\n1\n' stdout: 1 1stderr: sh: shopt: No such file or directory |
| mksh | 26 extended glob of single unicode char stdout: 0 1stderr: mksh: <stdin>[1]: shopt: not found |
| toysh | 26 extended glob of single unicode char [toysh stdout] Expected '0\n0\n', got '1\n1\n' stdout: 1 1stderr: sh: shopt: No such file or directory |
| toysh | 27 Extended glob in ${x//pat/replace} [toysh stdout] Expected 'foZ\n', got 'foo.py\n' stdout: foo.pystderr: sh: shopt: No such file or directory |
| osh | 27 Extended glob in ${x//pat/replace} stdout: stderr: echo ${x//@(?.py)/Z}
^~
[ stdin ]:3: fatal: extended globs not supported in ${x//GLOB/}
|
| toysh | 28 Extended glob in ${x%PATTERN} [toysh stdout] Expected 'strip % foo\nstrip %% foo\nstrip # .py\nstrip ## .py\n' Got 'strip % foo.py\nstrip %% foo.py\nstrip # foo.py\nstrip ## foo.py\n' stdout: strip % foo.py strip %% foo.py strip # foo.py strip ## foo.pystderr: sh: shopt: No such file or directory |