¿Cómo funciona GLOBIGNORE?

15

De acuerdo con la página del manual de 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.

Sin embargo en la práctica ...

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

¿Por qué se ..elimina de la lista de coincidencias? Que yo sepa, el patrón .NO coincide .., ¿verdad?

Ernest A
fuente

Respuestas:

14

Desplazarse hacia abajo ...

Los nombres de archivo .y ..siempre se ignoran cuando GLOBIGNOREse establece y no es nulo.

La mayoría de las veces, no es deseable incluir .y ..como comodines, ya que no representan archivos dentro del directorio, son hacks para que la navegación del directorio funcione. De hecho, el origen de los archivos de puntos es un error en una versión anterior del lscomando . El autor pretendía excluir .y ..de la lista, pero excluyó accidentalmente todos los archivos que comienzan con .. Por lo tanto, los archivos de puntos quedaron ocultos ls. Los proyectiles siguieron su ejemplo al ocultar archivos de puntos como ls. Sin embargo, la forma en que esto se hizo fue nuevamente un truco: los archivos que comienzan .solo se excluyen si el punto no coincide explícitamente en el patrón. Entonces el patrón .*incluye .y ...

Para preservar la compatibilidad con los scripts existentes, los shells modernos aún incluyen .y ..(excepto zsh, que en este tema, como muchos otros, tiene un comportamiento más sano pero no compatible con versiones anteriores). Sin embargo, si configura GLOBIGNORE, está utilizando una función específica de bash, que muestra que no está interesado en la compatibilidad con versiones anteriores. Entonces, la coincidencia de patrones cambia para excluir .y ..de todas las coincidencias de patrones.

La configuración GLOBIGNORE=.excluye un archivo que se excluye automáticamente de todos modos cada vez que GLOBIGNOREse configura, por lo que es equivalente a shopt -s dotglobexcepto eso .y ..además se excluye de todos los patrones.

Gilles 'SO- deja de ser malvado'
fuente
1
En realidad, me di cuenta de que la configuración GLOBIGNOREsolo ignora .y ..en patrones sin barra y GLOBIGNORE filtra las rutas de los archivos, no los nombres de los archivos. GLOBIGNORE=.; echo .*no incluirá .ni .., pero GLOBIGNORE=.; echo ./.*(o echo /bin/.*) lo hará! Para ignorar .y ..de todos los globos, parece que necesita shopt -s extgloby GLOBIGNORE='?(*/)@(.|..)'.
Stéphane Chazelas
1
En realidad, no, GLOBIGNORE='?(*/)@(.|..)'sería un fracaso para excluir .y ..en .*/foo. GLOBIGNORE='?(*/)@(.|..)?(/*)'rompería globos como ./*...
Stéphane Chazelas
3

De la sección titulada "Expansión del nombre de ruta" en man bash:

Los nombres de archivo ''. '' Y '' .. '' siempre se ignoran cuando GLOBIGNORE está configurado y no es nulo.

John1024
fuente