A passagem que você cita não significa o que você diz que significa.
Patterns Matching a Single Character
(…) An ordinary character is a pattern that shall match itself. (…) If any character (ordinary, shell special, or pattern special) is quoted, that pattern shall match the character itself.
Tudo isso se aplica apenas aos caracteres que se destacam em um padrão. Isso não se aplica a caracteres que aparecem em um contexto diferente daquele em que um caractere de padrão é esperado. Em particular, não se aplica dentro de uma expressão de colchetes. A sintaxe das expressões de colchetes é descrita na entrada para [
:
If an open bracket introduces a bracket expression as in XBD RE Bracket Expression, (…)
(Eu omiti o bit sobre !
vs ^
para complementação.) A descrição das expressões de colchetes RE não diz nada sobre aspas (o que não é de surpreender, já que é sobre expressões de colchetes em geral, não sobre expressões de colchetes em um padrão em um script de shell).
Indo por uma interpretação estrita do POSIX.1-2008, não está claro qual deve ser o padrão ["!"a]
. Uma interpretação é que deve corresponder a qualquer um dos caracteres "
, !
ou a
: o caractere "
não tem nenhum significado especial dentro de uma expressão de colchetes. Não consigo encontrar nada na especificação que possa invalidar essa interpretação. Outra interpretação é que "
mantém seu comportamento de cotação, mas isso significa que o conteúdo da expressão de colchetes é !a
e, como não há tratamento específico de caracteres citados dentro de expressões de colchetes, o conjunto é all-but- a
. Eu não consigo encontrar nenhum suporte para sua interpretação (e o comportamento de dash, bash e outros shells) na especificação POSIX. Faz sentido, claro, mas não é o que o texto diz.
Faz sentido que uma futura versão do POSIX imponha sua interpretação, adicionando algumas palavras a esse efeito. Por exemplo, a descrição de [
pode ser alterada para
If an open bracket introduces a bracket expression as in XBD RE Bracket Expression, except that the \ character (
'!'
) shall replace the \ character ('^'
) in its role in a non-matching list in the regular expression notation, it shall introduce a pattern bracket expression, and that any character that is quoted shall stand for itself as an element of the enclosing bracket expression, collating element or class expression. A bracket expression starting with an unquoted \ character produces unspecified results. Otherwise,'['
shall match the character itself.
Dado que o POSIX é mais descritivo do que normativo, eu esperaria que uma mudança como essa que quebra o ksh (geralmente o shell de referência) seja incluída apenas em uma grande atualização do padrão, e qualquer defeito na versão existente permitir pelo menos as diferentes interpretações existentes.