bashbaşlangıçta 80'lerin sonunda kshcsh / tcsh'ın bazı etkileşimli özellikleri ile kısmi bir klonu olarak tasarlandı .
Globbingin kökenleri, üzerine inşa ettiği önceki mermilerde bulunmalıdır.
kshkendisi Bourne kabuğunun bir uzantısıdır. Bourne kabuğunun kendisi (ilk olarak 1979'da Unix V7'de piyasaya sürüldü) sıfırdan temiz bir uygulamaydı, ancak Thompson kabuğundan (V1 -> V6'nın kabuğu) tamamen ayrılmadı ve Mashey kabuğundan özellikler içeriyordu.
Özellikle, komut argümanlar hala boşlukları ile ayrıldı |şimdi yeni boru operatör oldu ama ^hala bir alternatif olarak desteklenmiştir (ve aynı zamanda yapmanız açıklıyor [!a-z]değil [^a-z]), $1yine bir senaryoya ilk argüman oldu ve ters bölü hala kaçış karakterdi . Regexp operatörlerinin ( ^\|$) birçoğunun kabukta kendilerine özgü bir anlamı vardır.
Thompson kabuğu, globbing için harici bir faydaya dayanıyordu. Ne zaman shtırnaksız bulundu *, [ya da ?komuta s, içinden komutunu çalıştırın olur glob.
rm *.txt
Glob'u şu şekilde çalıştırır:
["glob", "rm", "*.txt"]
glob da rmbu kalıpla eşleşen dosyaların listesiyle çalışır .
grep a.\*b *.txt
şöyle çalışır glob:
["glob", "grep", "a.\252b", "*.txt"]
*Yukarıdaki önlenmesi, yani karaktere 8 bit ayarlayarak sözleri kaydedildi globjoker olarak ele alıp gelen. globaramadan önce o biti kaldıracaktır grep.
Regexps ile eşdeğerini yapmak için şu olurdu:
regexp rm '\.txt$'
Veya:
regexp rm '^[^.].*\.txt$'
nokta dosyalarını hariç tutmak için.
Kabuk özel karakterleri olarak ikiye katlandıkça operatörlerden kaçma ihtiyacı ., dosya adlarında yaygın olan bir normal ifade operatörü olması, dosya adlarını eşleştirmeyi ve yeni başlayanlar için karmaşık olmayı çok uygun hale getirmez. Çoğu durumda, ihtiyacınız olan tek şey bir ( ) veya herhangi bir sayıda ( ) karakterin yerini alabilen joker karakterlerdir.?*
Şimdi, farklı mermiler farklı globlama operatörleri ekledi. Günümüzde, ksh ve zsh glob'ları (ve bir dereceye kadar bash -O extglobksh glob'larının bir alt kümesini uygulayan) fonksiyonel olarak dosya adları ve mevcut kabuk sözdizimi ile daha az kullanışsız bir sözdizimiyle normal ifadelere eşdeğerdir. Örneğin, zsh(genişletilmişglob uzantısıyla) içinde şunları yapabilirsiniz:
echo a#.txt
ve aardından gelen dizilerden oluşan dosya adlarını eşleştirmek istiyorsanız (olası değil) .txt. Daha kolay echo (^a*\.txt$)(burada parantezleri, regex operatörlerini, kabukların onunla başa çıkabileceği tek yönlü olabilecek kabuk operatörlerinden izole etmenin bir yolu olarak kullanmak).
echo (foo|bar|<1-20>).(#i)mpg
Temel adı foo, bar veya ondalık sayı 1'den 20'ye kadar olan mpg dosyaları (büyük / küçük harf duyarlı) için ...
ksh93şimdi gloge'lerine regexps (temel, genişletilmiş, perl benzeri veya "artırılmış") ekleyebilir (oldukça buggy olmasına rağmen) ve hatta glob ve regexp ( printf %R, printf %P) arasında dönüştürme aracı sağlar :
echo ~(Ei:.*\.txt)
ile dosyaları txt maça (non-gizli) E , düzenli ifadeler Xtended küçük harf i nsensitively.
rm -- ^[^.].*\.txt$Bunun yerine yapmayı düşünür müsünüzrm -- *.txt?