bash
शुरू में 80 के दशक के अंत में ksh
csh / tsh से कुछ संवादात्मक विशेषताओं के साथ आंशिक क्लोन के रूप में डिजाइन किया गया था ।
ग्लोबिंग की उत्पत्ति उन पहले के गोले में पाई जानी है जो इसे बनाता है।
ksh
खुद बॉर्न शेल का विस्तार है। बॉर्न शेल खुद (1979 में यूनिक्स V7 में पहली बार जारी किया गया था) खरोंच से एक साफ कार्यान्वयन था, लेकिन यह थॉम्पसन शेल (V1 -> V6 के खोल) से पूरी तरह से विदा नहीं हुआ और माशे शेल से सुविधाओं को शामिल किया गया।
विशेष रूप से, कमांड तर्कों को अभी भी खाली करके अलग किया |
गया था , अब नया पाइप ऑपरेटर ^
था लेकिन फिर भी एक विकल्प के रूप में समर्थित था (और यह भी बताता है कि आप क्यों करते हैं [!a-z]
और क्या नहीं [^a-z]
), $1
अभी भी एक स्क्रिप्ट के लिए पहला तर्क था और बैकस्लैश अभी भी बच चरित्र था । तो कई regexp ऑपरेटर्स ( ^\|$
) शेल में अपने स्वयं के एक विशेष अर्थ रखते हैं।
थॉम्पसन शेल ग्लोबिंग के लिए एक बाहरी उपयोगिता पर निर्भर करता था। जब कमांड में sh
अयोग्य *
, [
या ?
s पाया जाता है , तो यह कमांड को रन करेगा glob
।
rm *.txt
अंत में चल रहे ग्लोब के रूप में होगा:
["glob", "rm", "*.txt"]
और ग्लोब rm
उस पैटर्न से मेल खाती फाइलों की सूची के साथ समाप्त हो जाएगा ।
grep a.\*b *.txt
निम्नानुसार चलेगा glob
:
["glob", "grep", "a.\252b", "*.txt"]
*
इसके बाद के संस्करण है कि चरित्र पर 8 बिट की स्थापना, रोकने के द्वारा उद्धृत किया गया है glob
वाइल्डकार्ड के रूप में यह इलाज से। glob
फिर कॉल करने से पहले उस बिट को हटा देगा grep
।
रेगेक्स के साथ बराबर करने के लिए, यह होगा:
regexp rm '\.txt$'
या:
regexp rm '^[^.].*\.txt$'
डॉट-फाइल्स को बाहर करने के लिए।
ऑपरेटरों से बचने की जरूरत है क्योंकि वे खोल विशेष पात्रों के रूप में दोगुना करते हैं, यह तथ्य कि .
, फ़ाइलनाम में आम एक रेगेक्स ऑपरेटर है, यह शुरुआती के लिए फ़ाइल नाम और जटिल मिलान करने के लिए बहुत उपयुक्त नहीं है। ज्यादातर मामलों में, आपको सभी वाइल्डकार्ड्स की आवश्यकता होती है जो किसी एक ( ?
) या किसी भी संख्या ( *
) वर्णों को बदल सकते हैं ।
अब, अलग-अलग गोले ने विभिन्न ग्लोबिंग ऑपरेटरों को जोड़ा। आजकल, ksh और zsh ग्लब्स (और कुछ हद तक bash -O extglob
जो ksh globs के एक सबसेट को लागू करता है) कार्यात्मक रूप से एक सिंटैक्स के साथ regexps के बराबर होता है जो फ़ाइल नाम और वर्तमान शेल सिंटैक्स के साथ उपयोग करने के लिए कम बोझिल होता है। उदाहरण के लिए, zsh
(एक्सटेंडेडग्लोब एक्सटेंशन के साथ), आप कर सकते हैं:
echo a#.txt
अगर आप चाहते हैं (संभावना नहीं) फ़ाइल नामों कि के दृश्यों से मिलकर मैच के लिए a
के बाद .txt
। की तुलना में आसान echo (^a*\.txt$)
(यहां शेल ऑपरेटरों से रेगेक्स ऑपरेटरों को अलग करने के तरीके के रूप में उपयोग किया जाता है जो एक तरह से गोले हो सकते थे जो इससे निपट सकते थे)।
echo (foo|bar|<1-20>).(#i)mpg
Mpg फ़ाइलों (केस असंवेदनशील) के लिए जिसका बेसन foo, बार या 1 से 20 तक एक दशमलव संख्या है ...
ksh93
अब अपने ग्लब्स में (हालांकि यह काफी छोटी गाड़ी है) regexps (मूल, विस्तारित, पर्ल-जैसे या "संवर्धित") को भी शामिल कर सकता है और यहां तक कि ग्लोब और regexp ( printf %R
, printf %P
) के बीच कनवर्ट करने के लिए एक उपकरण भी प्रदान करता है :
echo ~(Ei:.*\.txt)
मैच के लिए (गैर छुपा) txt के साथ फ़ाइलें ई नियमित अभिव्यक्ति xtended केस मैं nsensitively।
rm -- ^[^.].*\.txt$
इसके बजाय करने पर विचार करेंगेrm -- *.txt
?