Role para baixo …
Os nomes de arquivos .
e ..
sempre são ignorados quando GLOBIGNORE
definidos e não nulos.
Na maioria das vezes, não é desejável incluir .
e ..
como correspondências curinga, pois eles não representam arquivos dentro do diretório - são hacks para fazer a navegação no diretório funcionar. De fato, a origem dos arquivos de ponto é um bug em uma versão anterior do ls
comando . O autor pretendia excluir .
e ..
da lista, mas excluiu acidentalmente todos os arquivos que começaram com .
. Assim, os arquivos de ponto ficaram ocultos ls
. Os shells seguiram o exemplo, ocultando arquivos de pontos como ls
. No entanto, a maneira como isso foi feito foi novamente um hack: os arquivos iniciados com .
serão excluídos apenas se o ponto não corresponder explicitamente ao padrão. Portanto, o padrão .*
inclui .
e ..
.
Para preservar a compatibilidade com scripts existentes, os shells modernos ainda incluem .
e ..
(exceto o zsh, que nesta questão, como muitos outros, tem um comportamento mais saudável, mas não compatível com versões anteriores). No entanto, se você definir GLOBIGNORE
, você está usando um recurso específico do bash, que mostra que não está interessado em compatibilidade com versões anteriores. Portanto, a correspondência de padrão é alterada para excluir .
e ..
de todas as correspondências de padrão.
Definir GLOBIGNORE=.
exclui um arquivo que é excluído automaticamente de qualquer maneira, sempre que GLOBIGNORE
for definido, por isso é equivalente a shopt -s dotglob
exceto que .
e ..
além disso são excluídos de todos os padrões.
GLOBIGNORE
apenas ignora.
e..
em padrões sem barra, e o GLOBIGNORE filtra os caminhos de arquivos e não os nomes de arquivos.GLOBIGNORE=.; echo .*
não incluirá.
nem..
, masGLOBIGNORE=.; echo ./.*
(ouecho /bin/.*
) incluirá! Para ignorar.
e..
de todos os globs, parece que você precisashopt -s extglob
eGLOBIGNORE='?(*/)@(.|..)'
.GLOBIGNORE='?(*/)@(.|..)'
não seria suficiente para excluir.
e..
no.*/foo
.GLOBIGNORE='?(*/)@(.|..)?(/*)'
quebraria globs como./*
...Na seção intitulada "Expansão do nome do caminho" em
man bash
:fonte