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

8

O comportamento de .*incluir .e ..definir no LSB ou POSIX ou em alguma outra especificação?

lesmana
fonte

Respostas:

10

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 ( shcomando). A seção na globfunçã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.

Gilles 'SO- parar de ser mau'
fonte
Nota: bashnem sempre está em conformidade com o POSIX. somente quando é chamado como sh.
strugee
4

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).

lcipriani
fonte
0

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

maxschlepzig
fonte
Será que a LSB exigem man, man globou o homem-páginas para estar presente? Não encontrei homem aqui (para minha surpresa).
Ciro Santilli publicou
0

Tanto quanto eu posso dizer, o LSB 4.1 não exige bashe apenas sh.

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

Ciro Santilli adicionou uma nova foto
fonte