Respostas:
Citando a partir da especificação 2 do Single Unix, versão "Commands & Utilities", §2.13.3 :
Se um nome de arquivo começar com um ponto (
.
), o período deverá ser explicitamente correspondido usando um ponto como o primeiro caractere do padrão ou imediatamente após um caractere de barra. (…) Não é especificado se um período explícito em uma lista de correspondência de expressão entre colchetes, como[.abc]
um período inicial em um nome de arquivo.
Não há nenhuma exceção que faria o segundo período em ..
, ou a sequência vazia após o único período em .
, não correspondida pelo curinga em .*
. Portanto, o padrão diz que .*
corresponde .
e..
, por mais irritante que seja.
A passagem acima descreve o comportamento do shell ( sh
comando). A seção na glob
função da biblioteca C faz referência a esta passagem.
O idioma é exatamente o mesmo na versão 3 , também conhecida como POSIX: 2001 e IEEE 1003.1-2001, que é o que a maioria dos sistemas atuais implementa.
Dash, bash e ksh93 estão em conformidade com o POSIX. Pdksh e zsh (mesmo abaixo emulate sh
) não.
No ksh, você pode .*
pular .
e ..
definir FIGNORE='.?(.)'
, mas isso tem o efeito colateral de criar *
arquivos de ponto de inclusão. Ou você pode definir FIGNORE='.*'
, mas .*
não corresponde a nada.
No bash, você pode fazer .*
pular .
e ..
definir GLOBIGNORE='.:..'
, mas isso tem o efeito colateral de criar *
arquivos de ponto de inclusão. Ou você pode definir GLOBIGNORE='.*'
, mas .*
não corresponde a nada.
Provavelmente você quer dizer a funcionalidade na expansão bash sobre o globignore. Por padrão, a combinação de expansão do bash. e .. mas lendo o homem:
The GLOBIGNORE shell variable may be used to restrict the set of file names matching
a pattern. If GLOBIGNORE is set, each matching file name that also matches one of
the patterns in GLOBIGNORE is removed from the list of matches. The file names ``.''
and ``..'' are always ignored when GLOBIGNORE is set and not null. However, setting
GLOBIGNORE to a non-null value has the effect of enabling the dotglob shell option,
so all other file names beginning with a ``.'' will match. To get the old behavior
of ignoring file names beginning with a ``.'', make ``.*'' one of the patterns in
GLOBIGNORE. The dotglob option is disabled when GLOBIGNORE is unset.
Você pode definir a variável GLOBIGNORE=.:..
para quando digitar algo como isto:
rm -r * .*
você está removendo apenas o diretório atual. O padrão POSIX especifica apenas isso. é o diretório atual e .. no pai do diretório atual. O significado especial de. * É interpretado por bash ou outros shells (ou programas como grep).
A página de manual do Linux faz referência a POSIX.2, 3.13.
man
, man glob
ou o homem-páginas para estar presente? Não encontrei homem aqui (para minha surpresa).
Tanto quanto eu posso dizer, o LSB 4.1 não exige bash
e apenas sh
.
Para sh
isso segue POSIX (com uma extensão menor não relevante).
bash
nem sempre está em conformidade com o POSIX. somente quando é chamado comosh
.