Arasındaki fark nedir a[bc]d
ve a{b,c}d
? İnsanlar a{b,c}d
zaten varken neden kullanıyor a[bc]d
?
ls
ve yalnızca tek karakterleri denerseniz, aynı şekilde çalışıyor gibi görünürler.
Arasındaki fark nedir a[bc]d
ve a{b,c}d
? İnsanlar a{b,c}d
zaten varken neden kullanıyor a[bc]d
?
ls
ve yalnızca tek karakterleri denerseniz, aynı şekilde çalışıyor gibi görünürler.
Yanıtlar:
İkisi oldukça farklı.
a[bc]d
a, dosya kalıp (dışındaki kabuklarda fish
). İki dosya adına genişleyecektir abd
ve acd
eğer bunlar mevcut dizindeki mevcut dosyaların isimleriyse.
[...]
Parçası belirtilen (veya aralıklar dahil bu öğeleri harmanlama) olanlar arasından, tek bir karakter ile eşleşen bir parantez içi ifadesidir. Deseni eşleştirmek için a[bc]d
, dizeler arasındaki a
ve d
bir dosya adındaki karakterin a b
veya a olması gerekir c
.
Varsa abd
, ancak acd
yoksa, o zaman sadece genişler abd
ve tam tersi olur.
Ne olursa abd
, ne acd
var, kabuk ve seçeneklere bağlı olarak bir hataya neden (orijinal Unix olur sh
, (t)csh
, zsh
, fish
, bash -O failglob
) ve muhtemelen kabuk çıkmak, ya da (Bourne benzeri ve desen unexpanded¹ bırakın rc
benzeri kabukları) veya genişletmek hiçbir şey ( bash/zsh/yash -o nullglob
, bazı eski sürümleri fish
, özgün Unix sh
ve (t)csh
aynı komuta diğer eşleştirme Neználkovo varsa).
a{b,c}d
bir destek genişlemesidir (bunları destekleyen kabuklarda). İki genişleyecek dizeleri abd
ve acd
.
{...}
(Bazıları kabuk, bu da örneğin, bir dizi olabilir, bu örnekte bir parçası şeritlerinin virgülle ayrılmış dizi a..k
ya da 20..25
benzeri ya da daha gelişmiş olanlar 00..20..2
ya da 0..20..2%02d
), ve genleşme kuşatan bu şeritlerinin her biri birleştirilerek hesaplanır dizeleri a
ve d
. Bu dizgiler tek bir karakterden daha uzun olabilir ve ayrıca kendiliğinden genişleme de olabilir.
Genişleme, bu dizelerin mevcut dosya adlarına karşılık gelip gelmediğine bakılmaksızın gerçekleşir.
Dizeler oluşturuyorsanız, küme ayracı genişletme kullanın. Dosya adlarını eşleştiriyorsanız, bir dosya adı deseni kullanın.
Particular Bu özel durumda, a[bc]d
mevcut bir dosyanın adı olabilir, bu nedenle rm -f ./*.[ch]
bu kabuklarda rm -f ./*.{c,h}
olduğu gibi kullanımı potansiyel olarak tehlikelidir ve daha az sorunludur.
a{b,c}d
, b
ve c
parçalar tek harfleri olması gerekmez; örn ex{ten,ci}sion
. Bu harflerden ex[tenci]sion
yalnızca biriyle eşleşirken veya eşleşirse .
a[bc]d
bir desen eşleştirme ve POSIX standart bir parçasıdır. POSIX’de bu, “desen dizgesi ifadesi” olarak tanıtılır. Kılavuzun 2.13 bölümünde belgelenmiştir.
Alıntı yapılmadığında ve bir parantez ifadesinin dışında kaldığında, aşağıdaki üç karakter, modellerin tanımlanmasında özel bir anlama sahip olacaktır:
?
Soru işareti, herhangi bir karakterle eşleşecek bir kalıptır.
*Yıldız işareti, Birden Çok Karakter Eşleştirme Deseninde açıklandığı gibi birden çok karakterle eşleşecek bir modeldir.
[Açık braket, bir desen braketi ifadesi sunmalıdır.
Kısım 2.13.3 ayrıca, dosya adının genişletilmesi için kullanıldığında olağan regex'ler için beklenenden farklı davranacağından da bahseder.
Şimdiye kadar Tek Bir Karakter Eşleştirme Desenleri ve Birden Çok Karakter Eşleştirme Desenleri bölümünde açıklanan kurallar, dosya adı genişletme için kalıp eşleştirme notasyonu kullanıldığında uygulanan aşağıdaki kurallara göre nitelendirilir:
Bir yol adındaki eğik çizgi karakteri, desende bir veya daha fazla eğik çizgi kullanılarak açıkça eşleştirilir; ne yıldız veya soru işareti özel karakterleriyle ne de bir parantez ifadesiyle eşleştirilmemelidir. Desendeki eğik çizgiler, parantez ifadelerinden önce tanımlanmalıdır; bu nedenle, bir eğik çizgi, dosya adı genişletme için kullanılan desen braketi ifadesine dahil edilemez. Karşılık gelen bir kapanma köşeli parantez bulunmadan önce çıkıntı yapılmayan bir açık köşeli parantez karakterinin ardından bir eğik çizgi karakteri bulunursa, açık parantez sıradan bir karakter olarak ele alınmalıdır. Örneğin, desen veya
"a[b/c]d"
gibi patnames ile eşleşmiyor . Sadece kelimenin tam anlamıyla bir yol adıyla eşleşiyor .abd
a/d
a[b/c]d
a{b,c}d
olduğu parantez genişleme , bu POSIX tarafından şartnamede değildir. Bash el kitabının ilgili kısmı: (benim tarafımdan vurgu):
Ayraç genişletme, rastgele dizelerin üretilebileceği bir mekanizmadır . Bu mekanizma, dosya adı genişletme işlemine benzer (bkz. Dosya Adı Genişletme), ancak oluşturulan dosya adlarının bulunması gerekmez . Genişletilecek olan desenler isteğe bağlı bir başlangıç biçimini , ardından bir dizi virgülle ayrılmış dizi dizisi veya bir çift destek arasında bir sekans ifadesi ve ardından isteğe bağlı bir yazı yazısı şeklinde olur. Giriş, parantez içinde yer alan her dizeye önceden eklenir ve daha sonra, her bir sonuç dizisine soldan sağa doğru genişleyen postscript eklenir.
@ Mosvy'nin yorumuna göre, bu ilk olarak ortaya çıktı, csh
ancak içindeki davranış diğer kabuklardan bash
farklı csh
. Bu tip tellerin genişlemesi de ayrıca mevcuttur glob(3)
.
{a..z}
Yalnızca bash
3.0'dan sonra ortaya çıkan başka bir küme genişletme türü daha var ve bash
4.0'da daha fazla var .
Küreselleşmenin açık olduğu bir kabukta, boş bir klasörde yürütün, aşağıdaki sonuç döndürülür
$ echo a[bc]d
a[bc]d
$ echo a{b,c}d
abd acd
@ Jesse_b'in yorumuna cevap olarak, etkileşimli bir kabuk içindeyseniz ve her ikisi de geçerliyse, a[bc]d
yazmakta daha az sorun olur. Örneğin grep pattern [ab][12].txt
.
csh
uzun zaman önce ilk ortaya çıktı bash
. Ayrıca glob (3) kütüphane fonksiyonunda da bulunur. Aradaki fark, bash
başka açılımlardan önce yapıldığında: a=A; ab=A/B; ac=A/C; echo $a{b,c}
bash içerisinde diğer tüm kabuklardan farklı çalışacaktır.
command a[bc]d
?