Como o GLOBIGNORE funciona?

14

De acordo com a página de manual do bash:

   GLOBIGNORE
          A colon-separated list of patterns defining the set of filenames
          to be ignored by pathname expansion.  If a filename matched by a
          pathname  expansion  pattern also matches one of the patterns in
          GLOBIGNORE, it is removed from the list of matches.

No entanto, na prática ...

$ bash --noprofile --norc
bash-4.2$ touch .bar
bash-4.2$ echo .*
. .. .bar
bash-4.2$ GLOBIGNORE=.
bash-4.2$ echo .*
.bar

Por que .. foi removido da lista de correspondências? Tanto quanto eu sei, o padrão . NÃO corresponde a .. , responde?

    
por Ernest A 17.12.2013 / 01:37

2 respostas

14

Role para baixo

The filenames . and .. are always ignored when GLOBIGNORE is set and not null.

Na maioria das vezes, não é desejável incluir . e .. como correspondências curinga, já que elas não representam arquivos dentro do diretório - elas são hacks para fazer a navegação no diretório funcionar. Na verdade, a origem dos arquivos de pontos é um bug em uma versão anterior do comando ls . O autor pretendia excluir . e .. da listagem, mas excluiu acidentalmente todos os arquivos que começam com . . Assim, os arquivos dot ficaram ocultos de ls . Shells seguiram o exemplo, ocultando arquivos de pontos como ls . No entanto, a maneira como isso foi feito foi novamente um hack: os arquivos que começam com . são excluídos apenas se o ponto não for correspondido explicitamente no padrão. Portanto, o padrão .* inclui . e .. .

Para preservar a compatibilidade com os scripts existentes, os shells modernos ainda incluem . e .. (exceto zsh, que nessa questão como muitos outros tem um comportamento mais seguro, mas não compatível com versões anteriores). No entanto, se você definir GLOBIGNORE , estará usando um recurso específico do bash, o que mostra que você não está interessado em compatibilidade com versões anteriores. Portanto, as alterações de correspondência de padrões excluem . e .. de todas as correspondências de padrões.

A definição de GLOBIGNORE=. exclui um arquivo que é excluído automaticamente sempre que GLOBIGNORE é definido, por isso é equivalente a shopt -s dotglob , exceto que . e .. são excluídos de todos os padrões.

    
por 17.12.2013 / 01:49
3

Na seção "Expansão do nome do caminho" em man bash :

The file names ''.'' and ''..'' are always ignored when GLOBIGNORE is set and not null.

    
por 17.12.2013 / 01:46