Bagaimana cara kerja GLOBIGNORE?

15

Menurut halaman buku panduan 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.

Namun dalam praktiknya ...

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

Mengapa ..dihapus dari daftar yang cocok? Sejauh yang saya tahu, polanya .TIDAK cocok .., bukan?

Ernest A
sumber

Jawaban:

14

Gulir ke bawah ...

Nama file .dan ..selalu diabaikan ketika GLOBIGNOREdiatur dan bukan nol.

Sebagian besar waktu, itu tidak diinginkan untuk memasukkan .dan ..sebagai wildcard cocok, karena mereka tidak mewakili file di dalam direktori - mereka adalah peretasan untuk membuat navigasi berfungsi. Bahkan, asal file dot adalah bug di versi awalls perintah . Penulis bermaksud mengecualikan .dan ..dari daftar tetapi secara tidak sengaja mengecualikan semua file yang dimulai dengan .. Dengan demikian file dot menjadi tersembunyi ls. Kerang diikuti dengan menyembunyikan file dot suka ls. Namun cara ini dilakukan adalah hack sekali lagi: file yang dimulai dengan .hanya dikecualikan jika titik tidak cocok secara eksplisit dalam pola. Jadi polanya .*termasuk .dan ...

Untuk menjaga kompatibilitas dengan skrip yang ada, shell modern masih termasuk .dan ..(kecuali zsh, yang pada masalah ini seperti banyak yang lainnya memiliki perilaku yang lebih waras tetapi tidak kompatibel ke belakang). Namun, jika Anda mengatur GLOBIGNORE, Anda menggunakan fitur khusus bash, yang menunjukkan bahwa Anda tidak tertarik pada kompatibilitas mundur. Jadi perubahan pencocokan pola untuk mengecualikan .dan ..dari semua pencocokan pola.

Pengaturan GLOBIGNORE=.mengecualikan file yang dikecualikan secara otomatis kapan pun GLOBIGNOREdiatur, sehingga setara dengan shopt -s dotglobkecuali itu .dan ..selanjutnya dikecualikan dari semua pola.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Sebenarnya, saya baru sadar pengaturan GLOBIGNOREhanya mengabaikan .dan ..dalam pola slash-less dan path file filter GLOBIGNORE bukan nama file. GLOBIGNORE=.; echo .*tidak akan memasukkan .juga .., tetapi GLOBIGNORE=.; echo ./.*(atau echo /bin/.*) akan! Untuk mengabaikan .dan ..dari semua gumpalan, sepertinya Anda perlu shopt -s extglobdan GLOBIGNORE='?(*/)@(.|..)'.
Stéphane Chazelas
1
Sebenarnya, tidak, GLOBIGNORE='?(*/)@(.|..)'akan gagal untuk mengecualikan .dan ..masuk .*/foo. GLOBIGNORE='?(*/)@(.|..)?(/*)'akan memecahkan gumpalan seperti ./*...
Stéphane Chazelas
3

Dari bagian yang berjudul "Perluasan Pathname" di man bash:

Nama file ''. '' Dan '' .. '' selalu diabaikan ketika GLOBIGNORE diatur dan bukan nol.

John1024
sumber