É o comportamento de. * para incluir. e .. definido em LSB ou POSIX ou alguma outra especificação?

6

Como o título diz: o comportamento de .* inclui . e .. definidos em LSB ou POSIX ou alguma outra especificação?

    
por lesmana 24.08.2010 / 17:51

4 respostas

10

Citações da Especificação única do Unix versão 2, volume ”Comandos & Utilitários ", §2.13.3 :

If a filename begins with a period (.) the period must be explicitly matched by using a period as the first character of the pattern or immediately following a slash character. (…) It is unspecified whether an explicit period in a bracket expression matching list, such as [.abc] can match a leading period in a filename.

Não há 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 caractere curinga em .* . Portanto, o padrão diz que .* corresponde a . e .. , por mais irritante que seja.

A passagem acima descreve o comportamento do shell ( sh command). A seção sobre a função de biblioteca glob C faz referência a essa passagem.

A linguagem é exatamente a mesma na versão 3 , também conhecida como POSIX: 2001 e IEEE 1003.1-2001, que é o que a maioria dos sistemas atuais implementam.

Dash, bash e ksh93 estão em conformidade com o POSIX. Pdksh e zsh (mesmo sob emulate sh ) não.

Em ksh, você pode tornar .* skip . e .. definindo FIGNORE='.?(.)' , mas isso tem o efeito colateral de tornar * incluir arquivos de ponto. Ou você pode definir FIGNORE='.*' , mas .* não corresponde a nada.

No bash, você pode tornar .* skip . e .. definindo GLOBIGNORE='.:..' , mas isso tem o efeito colateral de tornar * incluir arquivos de ponto. Ou você pode definir GLOBIGNORE='.*' , mas .* não corresponde a nada.

    
por 24.08.2010 / 22:49
4

Provavelmente você quer dizer a funcionalidade na expansão do bash sobre o globignore. Por padrão, a correspondência de expansão 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=.:.. de modo que você digita algo assim:

rm -r * .*

você está removendo apenas o diretório atual. O padrão POSIX apenas especifica 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).

    
por 24.08.2010 / 20:45
0

A página de manual do Linux faz referência ao POSIX.2 3.13.

    
por 24.08.2010 / 20:46
0

Até onde eu sei, o LSB 4.1 não requer bash e somente sh .

Para sh , segue POSIX (com uma extensão menor não relevante).

    
por 26.11.2013 / 20:44