bash
başlangıçta 80'lerin sonunda ksh
csh / 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.
ksh
kendisi 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]
), $1
yine 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 sh
tı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 rm
bu 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 glob
joker olarak ele alıp gelen. glob
aramadan ö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 extglob
ksh 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 a
ardı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
?