Role para baixo …
Os nomes de arquivos .e ..sempre são ignorados quando GLOBIGNOREdefinidos 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 lscomando . 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 GLOBIGNOREfor definido, por isso é equivalente a shopt -s dotglobexceto que .e ..além disso são excluídos de todos os padrões.
GLOBIGNOREapenas 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 extglobeGLOBIGNORE='?(*/)@(.|..)'.