Przewiń w dół …
Nazwy plików .
i ..
są zawsze ignorowane, gdy GLOBIGNORE
są ustawione, a nie null.
W większości przypadków nie jest pożądane dołączanie .
i stosowanie ..
znaków wieloznacznych, ponieważ nie reprezentują one plików w katalogu - są włamaniami, aby nawigacja w katalogu działała. W rzeczywistości pochodzenie plików kropek jest błędem we wczesnej wersji ls
polecenia . Autor zamierzał wykluczyć .
i ..
z listy, ale przypadkowo wykluczył wszystkie pliki, które zaczynają się od .
. W ten sposób pliki kropek zostały ukryte ls
. Powłoki poszły w ich ślady, ukrywając pliki kropek takie jak ls
. Jednak sposób, w jaki to zrobiono, był ponownie włamaniem: pliki zaczynające się od .
są wykluczane tylko wtedy, gdy kropka nie jest wyraźnie dopasowana do wzorca. Więc wzorzec .*
obejmuje .
i ..
.
Aby zachować zgodność z istniejącymi skryptami, współczesne powłoki nadal zawierają .
i ..
(oprócz zsh, który w tej kwestii, podobnie jak wiele innych, ma bardziej rozsądne, ale nie kompatybilne wstecz zachowanie). Jeśli jednak ustawisz GLOBIGNORE
, używasz funkcji specyficznej dla bash, która pokazuje, że nie jesteś zainteresowany kompatybilnością wsteczną. Więc zmiany dopasowania wzorca, aby wykluczyć .
i ..
ze wszystkich dopasowań wzorca.
Ustawienie GLOBIGNORE=.
wyklucza plik, który jest i tak automatycznie wykluczany, ilekroć GLOBIGNORE
jest ustawiony, więc jest równoważny z shopt -s dotglob
wyjątkiem tego .
i ..
jest ponadto wykluczany ze wszystkich wzorców.
GLOBIGNORE
ignoruj.
i..
we wzorcach bez ukośników, a GLOBIGNORE filtruje ścieżki plików, a nie nazwy plików.GLOBIGNORE=.; echo .*
nie będzie zawierać.
ani..
, aleGLOBIGNORE=.; echo ./.*
(lubecho /bin/.*
) będzie! Aby zignorować.
i..
ze wszystkich globów, wygląda na to, że potrzebujeszshopt -s extglob
iGLOBIGNORE='?(*/)@(.|..)'
.GLOBIGNORE='?(*/)@(.|..)'
to nie wyklucza.
, a..
w.*/foo
.GLOBIGNORE='?(*/)@(.|..)?(/*)'
rozbija globusy jak./*
...Z sekcji „Rozszerzenie nazwy ścieżki” w
man bash
:źródło