Um '*' (estrela) em globbing corresponde apenas a caracteres (isto é, a-z e 0-9)?

1

Eu tenho uma pergunta simples aqui: um * (curinga de estrela) combina apenas caracteres (letras e números) no estilo glob? Ou será que ele também combina com caracteres especiais?

No bash, * corresponde a tudo, enquanto em csh * corresponde apenas a caracteres alfanuméricos.

Existe alguma regra de compatibilidade para isso? Alguém pode esclarecer?

    
por user2720323 30.05.2014 / 15:36

2 respostas

4

* é um padrão de nome de arquivo que corresponde a qualquer sequência de caracteres.

Quando usado como um glob (na expansão / geração de nome de arquivo) * não corresponde a caracteres de barra (bem, o padrão é verificado na lista de arquivos no diretório atual) ou um ponto inicial.

Agora, a definição de caractere vem mudando com o tempo. Atualmente, a definição ou um caractere é dependente do local. Atualmente, a maioria dos locais usa a codificação UTF-8 para texto, o que significa que os caracteres são seqüências de bytes de comprimento variável. Por exemplo a é 0x61 enquanto é é 0xc3 0xa9. Em UTF-8, nem todas as seqüências de bytes formam caracteres válidos. Por exemplo, 0x61 0xc3 0x61 é inválido. Enquanto 0x61 se traduz em a , 0xc3 não pode traduzir para um caractere.

Na maioria dos shells, * também corresponderá a não caracteres, portanto, * será expandido para todos os arquivos no diretório atual cujo nome não comece com . , independentemente de os bytes nos nomes dos arquivos forma caracteres válidos no local atual ou não. Uma exceção a isso parece ser pelo menos o csh-20110502 encontrado no meu sistema Debian (baseado no csh do OpenBSD).

$ touch "$(printf '\xc3')" "$(printf '\xc3\xa9')"
$ ls
?  é
$ locale charmap
UTF-8
$ bash -c 'echo *' | sed -n l
3 31$
$ csh -c 'echo *' | sed -n l
31$

3 (uma representação do byte 0xc3) está faltando na saída com csh porque esse não é um caractere válido.

$ LC_ALL=C csh -c 'echo *' | sed -n l
3 31$

Na localidade C, os caracteres são mapeados para bytes (embora os caracteres para valores acima de 0x7f não estejam definidos), então 0xc3 é um caractere e 0xc3 0xa9 são dois caracteres.

De qualquer forma, não há razão para usar o csh no Debian. Use tcsh se você quiser um shell csh -like, mas o melhor é evitar usar csh completamente.

    
por 30.05.2014 / 17:19
1

Das Especificações do Open Group Base Edição 6 Seção IEEE Std 1003.1 2.13.2 Padrões Correspondentes Múltiplos Personagens

The asterisk ( '*' ) is a pattern that shall match any string, including the null string.

Isso significa que * corresponderá a qualquer caractere sem restrições.

    
por 30.05.2014 / 15:52

Tags