GLOBIGNORE nasıl çalışır?


15

Bash'ın manuel sayfasına göre:

   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.

Ancak uygulamada ...

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

Neden ..maç listesinden çıkarılır? Bildiğim kadarıyla, desen eşleşmiyor ., değil ..mi?

Yanıtlar:


14

Aşağı kaydırın

Dosya adları .ve null değil ayarlandığında ..her zaman yoksayılır GLOBIGNORE.

Çoğu zaman, dizin içindeki dosyaları temsil etmedikleri için joker karakter eşleşmeleri eklemek .ve ..joker karakter eşleşmeleri olarak arzu edilmez - dizin gezinme işlemlerini yapmak için hack'lerdir. Aslında, nokta dosyalarının kökeni komutun ilk sürümünde bir hatadırls . Yazar listeden hariç tutmayı .ve ..listeden hariç tutmayı amaçlıyordu ancak ile başlayan tüm dosyaları yanlışlıkla hariç tuttu .. Böylece nokta dosyaları gizlendi ls. Kabuklar, nokta dosyaları gibi gizleyerek bunları izledi ls. Ancak bunun tekrar yapılması bir hackti: ile başlayan dosyalar .sadece nokta kalıpta açıkça eşleşmezse hariç tutulur. Böylece desen ve .*içerir ....

Mevcut komut dosyalarıyla uyumluluğu korumak için, modern kabuklar hala içerir .ve ..(zsh hariç, bu konuda diğerleri gibi daha akılcı ama geriye dönük uyumlu olmayan bir davranışa sahiptir). Ancak, ayarlarsanız GLOBIGNORE, geriye dönük uyumlulukla ilgilenmediğinizi gösteren bash'a özgü bir özellik kullanırsınız. Desen eşleştirme dışlamak değiştirir Yani .ve ..tüm desen maçlarından.

Ayar GLOBIGNORE=.Dahil Olmayanlar her neyse otomatik dışlanan bir dosya GLOBIGNOREhazır durumda eşdeğerdir, böylece shopt -s dotglobo hariç .ve ..ayrıca tüm desenleri dışında tutulur.


1
Aslında, GLOBIGNOREsadece göz ardı .ve ..eğik çizgi desenleri ayarını fark ettim ve GLOBIGNORE dosya adlarını değil dosya yollarını filtreler. ne GLOBIGNORE=.; echo .*içermez , ama (veya ) içermez ! Göz ardı etmek ve ihtiyacınız gibi tüm Neználkovo gelen, görünüşe ve . ...GLOBIGNORE=.; echo ./.*echo /bin/.*...shopt -s extglobGLOBIGNORE='?(*/)@(.|..)'
Stéphane Chazelas

1
Aslında, hayır, GLOBIGNORE='?(*/)@(.|..)'dışlamak için başarısız olur .ve ..içinde .*/foo. GLOBIGNORE='?(*/)@(.|..)?(/*)'gibi ./*
glob

3

"Yol Adı Genişletme" başlıklı bölümden man bash:

''. '' Ve '' .. '' dosya adları GLOBIGNORE ayarlandığında her zaman yok sayılır, boş değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.