*
é 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.