बीच क्या अंतर है a[bc]d
और a{b,c}d
? a{b,c}d
जब पहले से ही है तो लोग इसका इस्तेमाल क्यों करते हैं a[bc]d
?
ls
और आप केवल एकल वर्णों को आज़माते हैं, तो वे उसी के लिए काम करेंगे।
बीच क्या अंतर है a[bc]d
और a{b,c}d
? a{b,c}d
जब पहले से ही है तो लोग इसका इस्तेमाल क्यों करते हैं a[bc]d
?
ls
और आप केवल एकल वर्णों को आज़माते हैं, तो वे उसी के लिए काम करेंगे।
जवाबों:
दोनों काफी अलग हैं।
a[bc]d
एक फ़ाइल नाम पैटर्न है (गोले के अलावा अन्य fish
)। इसका विस्तार दो फाइलनामों तक होगा abd
और acd
यदि वे मौजूदा निर्देशिका में मौजूदा फ़ाइलों के नाम हैं।
[...]
भाग एक कोष्ठकों के भीतर अभिव्यक्ति है कि सूचीबद्ध (या जब पर्वतमाला शामिल किए गए हैं तत्वों का मिलान) लोगों में से एक भी अक्षर से मेल खाता है। पैटर्न से मेल खाने के लिए a[bc]d
, तार a
और d
फ़ाइल नाम के बीच का वर्ण b
या तो होना चाहिए या एक c
।
यदि abd
मौजूद है, लेकिन acd
ऐसा नहीं है, तो यह केवल विस्तार करेगा abd
, और इसके विपरीत।
तो न तो abd
, और न ही acd
मौजूद हैं, खोल और विकल्पों के आधार पर, यह एक त्रुटि (मूल यूनिक्स ट्रिगर करेगा sh
, (t)csh
, zsh
, fish
, bash -O failglob
) और संभवतः खोल से बाहर निकलें, या पैटर्न unexpanded¹ छोड़ (बॉर्न की तरह और rc
तरह के गोले) या करने के लिए विस्तार कुछ नहीं ( bash/zsh/yash -o nullglob
, के कुछ पुराने संस्करण fish
, मूल यूनिक्स sh
और (t)csh
यदि एक ही कमांड में अन्य मिलान वाले ग्लोब हैं)।
a{b,c}d
एक ब्रेस विस्तार (गोले में जो इनका समर्थन करते हैं) है। यह दो करने के लिए विस्तार होगा तार abd
और acd
।
{...}
भाग तार की अल्प विराम द्वारा सीमांकित सेट है (इस उदाहरण में, कुछ खोल में, यह भी इस तरह के रूप में एक सीमा हो सकती है a..k
या 20..25
या अधिक उन्नत की तरह लोगों को 00..20..2
या 0..20..2%02d
), और विस्तार फ्लैंकिंग के साथ इन तार के प्रत्येक संयोजन के द्वारा की जाती है तार a
और d
। ये तार एक ही चरित्र से अधिक लंबे हो सकते हैं और खुद भी ब्रेस एक्सपेंशन हो सकते हैं।
विस्तार इस बात की परवाह किए बिना होता है कि ये तार मौजूदा फाइलनामों से मेल खाते हैं या नहीं।
यदि आप स्ट्रिंग्स का निर्माण कर रहे हैं, तो ब्रेस विस्तार का उपयोग करें। यदि आप फ़ाइल नाम मिलान कर रहे हैं, तो फ़ाइल नाम पैटर्न का उपयोग करें।
Of इस विशेष मामले में, a[bc]d
एक मौजूदा फ़ाइल का नाम हो सकता है , यही वजह है कि rm -f ./*.[ch]
उन गोले जैसी चीजों का उपयोग करना संभवतः खतरनाक है और rm -f ./*.{c,h}
एक समस्या से कम नहीं है।
a{b,c}d
, b
और c
भागों को एक अक्षर होने की आवश्यकता नहीं है; उदा ex{ten,ci}sion
। जबकि ex[tenci]sion
या जो भी हो , इनमें से केवल एक पत्र से मेल खाएगा ।
a[bc]d
है पैटर्न मिलान , और POSIX मानक का हिस्सा है। POSIX में, इसे "पैटर्न ब्रैकेट अभिव्यक्ति" के रूप में पेश किया गया है। यह मैनुअल के खंड 2.13 में प्रलेखित है
जब एक ब्रैकेट अभिव्यक्ति के बाहर और बाहर, निम्न तीन वर्णों का पैटर्न के विनिर्देशन में विशेष अर्थ होगा:
?
प्रश्न-चिह्न एक पैटर्न है जो किसी भी वर्ण से मेल खाता है।
*एक तारांकन एक ऐसा पैटर्न है जो कई वर्णों से मेल खाता है, जैसा कि कई वर्णों से मेल खाने वाले पैटर्न में वर्णित है।
[खुला ब्रैकेट एक पैटर्न ब्रैकेट अभिव्यक्ति पेश करेगा।
धारा २.१३.३ में भी कुछ का उल्लेख है कि यह सामान्य रीगेक्स के लिए अलग-अलग व्यवहार करता है जब इसका उपयोग फ़ाइल नाम विस्तार (मेरे द्वारा जोर) के लिए किया जाता है
पैटर्न में अब तक वर्णित नियम एकल वर्ण और प्रतिमानों का मिलान करते हुए एकाधिक वर्णों का मिलान निम्न नियमों द्वारा योग्य है जो तब लागू होते हैं जब फ़ाइल नाम विस्तार के लिए पैटर्न मिलान संकेतन का उपयोग किया जाता है:
पथनाम में स्लैश वर्ण को पैटर्न में एक या अधिक स्लैश का उपयोग करके स्पष्ट रूप से मिलान किया जाएगा; यह न तो तारांकन या प्रश्न-चिह्न विशेष वर्णों से मेल खाना चाहिए और न ही एक ब्रैकेट अभिव्यक्ति द्वारा। ब्रैकेट के भाव से पहले पैटर्न में स्लैश की पहचान की जाएगी; इस प्रकार, एक स्लैश को फ़ाइल नाम विस्तार के लिए उपयोग किए जाने वाले पैटर्न ब्रैकेट अभिव्यक्ति में शामिल नहीं किया जा सकता है। यदि एक स्लैश कैरेक्टर एक समान ओपनिंग स्क्वायर ब्रैकेट से पहले एक अनकैप्ड ओपन स्क्वायर ब्रैकेट कैरेक्टर पाया जाता है, तो ओपन ब्रैकेट को एक साधारण कैरेक्टर माना जाएगा। उदाहरण के लिए, पैटर्न
"a[b/c]d"
ऐसे पैथनामों से मेल नहीं खाताabd
याa/d
। यह केवल शाब्दिक रूप से एक मार्गनाम से मेल खाता हैa[b/c]d
।
a{b,c}d
है ब्रेसिज़ विस्तार , यह POSIX द्वारा विनिर्देश में नहीं है। यहाँ बैश मैनुअल (मेरे द्वारा जोर) से संबंधित भाग है :
ब्रेस विस्तार एक तंत्र है जिसके द्वारा मनमाने तार उत्पन्न किए जा सकते हैं। यह तंत्र फ़ाइल नाम विस्तार के समान है ( फाइलनाम विस्तार देखें), लेकिन उत्पन्न फ़ाइल नाम की आवश्यकता नहीं है । ब्रेस विस्तारित किए जाने वाले पैटर्न एक वैकल्पिक प्रस्तावना का रूप लेते हैं , इसके बाद कॉमा-पृथक स्ट्रिंग्स की एक श्रृंखला या ब्रेसिज़ की एक जोड़ी के बीच एक अनुक्रम अभिव्यक्ति, इसके बाद एक वैकल्पिक पोस्टस्क्रिप्ट होता है। प्रस्तावना को ब्रेसिज़ के भीतर निहित प्रत्येक स्ट्रिंग के लिए उपसर्ग किया जाता है, और पोस्टस्क्रिप्ट को फिर प्रत्येक परिणामी स्ट्रिंग से जोड़ दिया जाता है, बाएं से दाएं विस्तारित होता है।
@Mosvy की टिप्पणी के अनुसार, यह पहली बार दिखाई दिया था csh
लेकिन व्यवहार में अन्य गोले bash
से भिन्न है csh
। इस प्रकार के ब्रेस विस्तार भी मौजूद हैं glob(3)
।
एक अन्य प्रकार का ब्रेसिज़ विस्तार है {a..z}
जो केवल bash
3.0 के बाद दिखाई दिया , और bash
4.0 में अधिक जोड़े गए हैं ।
एक शेल में जहां ग्लोबिंग चालू होता है, एक खाली फ़ोल्डर में निष्पादित होता है, निम्नलिखित परिणाम वापस आ जाता है
$ echo a[bc]d
a[bc]d
$ echo a{b,c}d
abd acd
@ Jesse_b की टिप्पणी के जवाब में, यदि आप एक इंटरैक्टिव शेल में हैं और दोनों लागू होते हैं, a[bc]d
तो टाइप करने में कम परेशानी होती है। उदाहरण के लिए grep pattern [ab][12].txt
।
csh
, बहुत पहले bash
। यह ग्लोब (3) लाइब्रेरी फंक्शन में भी मौजूद है। अंतर यह है कि bash
यह अन्य विस्तार से पहले किया जाता है: a=A; ab=A/B; ac=A/C; echo $a{b,c}
किसी भी अन्य शेल से अलग तरीके से काम करेगा।
command a[bc]d
?