Come funziona GLOBIGNORE?


15

Secondo la pagina del manuale di 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.

Comunque in pratica ...

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

Perché viene ..rimosso dall'elenco delle corrispondenze? Per quanto ne so, il modello .NON corrisponde .., vero?

Risposte:


14

Scorri verso il basso ...

I nomi dei file .e ..vengono sempre ignorati quando GLOBIGNOREè impostato e non null.

Il più delle volte, non è desiderabile includere .e ..come corrispondenze di caratteri jolly, poiché non rappresentano i file all'interno della directory - sono degli hack per far funzionare la navigazione della directory. In effetti, l'origine dei file dot è un bug in una versione iniziale del lscomando . L'autore intendeva escludere .e ..dall'elenco ma ha accidentalmente escluso tutti i file che iniziano con .. In questo modo i file di punti vengono nascosti da ls. Le conchiglie hanno seguito l'esempio nascondendo file di punti come ls. Tuttavia, il modo in cui è stato fatto è stato di nuovo un trucco: i file che iniziano con .sono esclusi solo se il punto non viene abbinato esplicitamente nel modello. Quindi il modello .*include .e ...

Per preservare la compatibilità con gli script esistenti, le shell moderne includono ancora .e ..(tranne zsh, che su questo problema come molti altri ha un comportamento più sano ma non compatibile con le versioni precedenti). Tuttavia, se imposti GLOBIGNORE, stai utilizzando una funzione specifica di bash, che mostra che non sei interessato alla compatibilità con le versioni precedenti. Quindi la corrispondenza dei motivi cambia per escludere .e ..da tutte le corrispondenze dei motivi.

L'impostazione GLOBIGNORE=.esclude un file che viene comunque escluso automaticamente ogni volta che GLOBIGNOREviene impostato, quindi equivale a shopt -s dotglobtranne quello .e ..viene inoltre escluso da tutti i pattern.


1
In realtà, ho appena realizzato che l'impostazione GLOBIGNOREignora .e ..in modelli senza barra e GLOBIGNORE filtra i percorsi dei file non i nomi dei file. GLOBIGNORE=.; echo .*non includerà ..., ma GLOBIGNORE=.; echo ./.*(o echo /bin/.*) lo farà! Per ignorare .e ..da tutti i globs, sembra che tu abbia bisogno shopt -s extglobe GLOBIGNORE='?(*/)@(.|..)'.
Stéphane Chazelas,

1
In realtà, no, GLOBIGNORE='?(*/)@(.|..)'non riuscirebbe ad escludere .e ..in .*/foo. GLOBIGNORE='?(*/)@(.|..)?(/*)'spezzerebbe i globs come ./*...
Stéphane Chazelas il

3

Dalla sezione "Espansione percorso" in man bash:

I nomi dei file ''. '' E '' .. '' vengono sempre ignorati quando GLOBIGNORE è impostato e non null.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.