`. []. Foo []` bash'de ne yapar? Neden ".." ile eşleşiyor?


16

Aşağıdakilere bakın:

$ echo .[].aliases[]
..
$ echo .[].foo[]
..
$ echo .[].[]
..
$ echo .[].xyz[]
..
$ echo .xyz[].xyz[]
.xyz[].xyz[]
$ echo .xyz[].[]
.xyz[].[]

Görünüşe göre bu bir şey yüceltiyor gibi görünüyor, ama sonucun nasıl bir araya geldiğini anlamıyorum. Anladığım kadarıyla []boş bir karakter sınıfı. Eğer sezgisel olurdu

  • yalnızca boş dizeyle eşleşti; bu durumda, bash'ın bütünüyle çoğalmasını beklerim, çünkü bu dizinde hiçbir şey eşleşmez, aynı zamanda ..aliases(ilk örnekte),
  • ya da hiçbir şey; bu durumda, bash dizesini de toplamayı beklerdim.

Bu GNU bash, sürüm 4.4.23 (1) -release ile.

Yanıtlar:


25

[Bir dizi başlatır. Bir küme tarafından sonlandırılır ]. Ancak ]setin bir parçası olmanın bir yolu vardır ve bu, ]ilk karakteri olarak belirtmektir . Boş bir setin mantıklı olmadığı için bu belirsiz değildir.

Yani örnekleriniz temel olarak bir noktayı, ardından da nokta içeren bir kümeyi gösterir, bu nedenle iki noktayla eşleşir.

Sonraki örnekler herhangi bir dosya bulamaz ve bu nedenle kelimesi kelimesine döndürülür.


4

Yalnızca alıntılanan dizeler globbing'e tabi değildir :

$ echo ".[].aliases[]"
.[].aliases[]

Ancak alıntı yapılmayan dizeler globbinge tabidir. Bir *veya bir ?veya (geçerli) [](köşeli ayraç ifadesi) içeren alıntılanmamış bir dize, kendisiyle eşleşen dosya listesi tarafından değiştirilir. Aynı şekilde *, eşleşen dizindeki tüm dosyalara ?dönüşecek ve yalnızca bir karakterin dosyalarıyla eşleşecek şekilde, (geçerli) []dosyaları parantez içindeki karakterlerle eşleştirecektir. Nokta geçerli bir karakterdir:

$ echo a[.]b
a[.]b

$ touch "a.b"
$ echo a[.]b
a.b

Biriyle eşleşebilmek ]için parantez içindeki ilk karakter olmalıdır:

$ touch "a]b"
$ ls a[]]b
a]b

Boş bir parantez ifadesi bir anlam ifade etmiyor (ve genişletilmiyor):

$ touch ab
$ ls a[]b
ls: cannot access 'a[]b': No such file or directory

Bu yüzden çalışır:

$ touch a]c abc afc azc a:c a?c aoc 
$ ls a[]bfz:?]c
abc  a:c  a?c  a]c  afc  azc

İçin [fikri benzer:

$ touch a[c
$ ls a[[]c
a[c

ancak köşeli ayraç ifadesinde herhangi bir konumda olabilir:

$ ls a[]bf[z:?]c
abc  a:c  a?c  a[c  a]c  afc  azc

$ ls a[]bfz:?[]c
abc  a:c  a?c  a[c  a]c  afc  azc

Gönderdiğiniz dize .[].foo[]bir noktayla ve ardından a ], a ., a f, a oveya a ile eşleşir [. Benzer:

$ echo a[].foo[]c
a[c a]c afc aoc

Ve aşağıdaki gibi eşleşecektir:

$ touch .] .f .o .[ .a .b .z

$ echo .[].foo[]
.. .[ .] .f .o

Dizin girdisinin .., varsayılan olarak her dizinde bulunduğundan oluşturulması gerekmediğini unutmayın. Ancak basit bir nokta ., açıkça (aslında bir nokta kullanarak) eşleştirilmesi gerektiğinden bir glob tarafından eşleştirilmez.

Ancak ..aliases, parantez ifadesi yalnızca bir karakterle eşleşeceğinden bu eşleşmez . Birkaç karakteri eşleştirmek için *(herhangi bir şey) kullanmanız gerekir :

$ touch ..a ..l ..i ..aliases ..alias ..ali
$ echo .[].aliases[]
.. .[ .] .a

$ echo .[].aliases[]*
.. .[ .] .a ..a ..ali ..alias ..aliases ..i ..l
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.