Hey. Forwarding this from: https://lore.kernel.org/dash/YeZbt7nhvODBSL0I@gondor.apana.org.au/T/#mb9438ab3009b9e38a2e22fdd22e99ddd74078b93 where it was suggested that this may be a bug in fnmatch(). Assuming a pattern of: [.*^\] my understanding was that this would actually mean: - the literal string [. followed by - the pattern notation special character * (i.e. any string) followed by - the literal string ^] Because ] is escaped, it's to be taken literally and in a pattern a [ without corresponding ] is to be taken literally as well. (see POSIX, https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 ) That seems to work in dash (which according to its maintainer uses fnmatch() for the matching): $ case '[.^]' in ([.*^\]) echo match;; (*) echo no match;; esac match $ case '[.x^]' in ([.*^\]) echo match;; (*) echo no match;; esac match $ case '[.xx^]' in ([.*^\]) echo match;; (*) echo no match;; esac match However, adding another [ to the pattern: [.*^[\] which should be: - the literal string [. followed by - the pattern notation special character * (i.e. any string) followed by - the literal string ^[] No longer matches: $ case '[.^[]' in ([.*^[\]) echo match;; (*) echo no match;; esac no match $ case '[.x^[]' in ([.*^[\]) echo match;; (*) echo no match;; esac no match $ case '[.xx^[]' in ([.*^[\]) echo match;; (*) echo no match;; esac no match Whereas, AFAIU POSIX, it should. This works, btw. in bash (no idea whether that uses fnmatch() too), but neither in busybox sh, nor klibc sh. Thanks, Chris.
Fixed in 2.35.
Thanks :-)