2013-06-19 4 views
38

मैं बस यहाँ बैश extglob खोल विकल्प के बारे में पता चला: - How can I use inverse or negative wildcards when pattern matching in a unix/linux shell?मैं बैश में extglob सक्षम क्यों नहीं छोड़ूँगा?

सभी उत्तरों shopt -s extglob भी shopt -u extglob उल्लेख इसे बंद करने के लिए प्रयोग किया जाता है। मैं कुछ इतना उपयोगी क्यों बदलना चाहूंगा? वास्तव में यह डिफ़ॉल्ट रूप से क्यों नहीं है? संभवतः इसमें कुछ ग़लत आश्चर्य देने की क्षमता है। वे क्या हैं?

उत्तर

35

कोई बुरा आश्चर्य नहीं - डिफ़ॉल्ट, व्यवहार पारंपरिक, मानक-अनुरूप पैटर्न वाक्यविन्यास के साथ संगतता के लिए केवल वहां है।


है कौन सा कहना है: यह (संभावना नहीं यद्यपि) संभव है कि किसी लेखन fo+(o).*वास्तव में+ और कोष्ठक इरादा पैटर्न उनके कोड के अनुरूप का शाब्दिक हिस्से के रूप में इलाज किया जाना है। POSIX sh विनिर्देश कॉल के मुकाबले इस अभिव्यक्ति को अलग-अलग तरीके से समझने के लिए बाश के लिए बहुत कम मामलों में डिफ़ॉल्ट रूप से किया जाता है (echo -expg_echo के साथ तुरंत एकमात्र ऐसा होता है जो तुरंत दिमाग में आता है) ।

यह सामान्य मामले में जहां पार्टी एक्सटेंशन POSIX मानक के आधार पर व्यवहार अपरिभाषित बढ़ा रहे हैं से अलग है - ऐसे मामलों में जहां एक आधार रेखा POSIX खोल आम तौर पर एक त्रुटि फेंक होगा, लेकिन पार्टी के बजाय कुछ नया और अलग स्पष्ट रूप से प्रलेखित व्यवहार प्रदान करता है - - क्योंकि इन पात्रों को स्वयं मिलान करने के रूप में इलाज करने की आवश्यकता को POSIX द्वारा परिभाषित किया गया है।

the relevant part of the specification के शब्दों में, जोर देने के साथ कहा:

एक साधारण चरित्र एक पैटर्न है कि खुद से मेल खाते हैं जाएगा। यह एनयूएल को छोड़कर समर्थित चरित्र सेट में कोई भी चरित्र हो सकता है, Quoting में उन विशेष शैल वर्णों को उद्धृत करने की आवश्यकता है, और निम्नलिखित तीन विशेष पैटर्न वर्ण। मिलान चरित्र के एन्कोडिंग के लिए उपयोग किए गए बिट पैटर्न पर आधारित होगा, न कि चरित्र के ग्राफिक प्रतिनिधित्व पर। यदि कोई चरित्र (सामान्य, खोल विशेष, या पैटर्न विशेष) उद्धृत किया गया है, तो वह पैटर्न चरित्र से मेल खाएगा। खोल विशेष पात्रों को हमेशा उद्धरण की आवश्यकता होती है।

जब गैर उद्धृत और एक ब्रैकेट अभिव्यक्ति के बाहर, निम्नलिखित तीन पात्रों पैटर्न के विवरण में विशेष अर्थ नहीं होंगे:

  • ? - एक प्रश्न चिह्न एक पैटर्न है कि किसी भी चरित्र से मेल खाते हैं जाएगा।
  • * - एक तारांकन एक पैटर्न है जो Patterns Matching Multiple Characters में वर्णित अनुसार कई वर्णों से मेल खाता है।
  • [ - खुला ब्रैकेट एक पैटर्न ब्रैकेट अभिव्यक्ति पेश करेगा।

इस प्रकार, मानक स्पष्ट रूप से किसी भी गैर NUL ?, * या [ या खुद को मैच के लिए के हवाले से की आवश्यकता होती है के रूप में कहीं और सूचीबद्ध के अलावा अन्य चरित्र की आवश्यकता है। डिफ़ॉल्ट रूप से extglob बंद होने के बैश का व्यवहार यह इस मानक के साथ अपने डिफ़ॉल्ट विन्यास में अनुरूप करने की अनुमति देता है।


हालांकि, अपनी खुद की स्क्रिप्ट और अपने स्वयं के इंटरैक्टिव खोल के लिए, जब तक आप असामान्य पैटर्न के साथ POSIX श के लिए लिखा कोड चलाने की आदत बना रहे हैं शामिल, सक्रिय करने के extglob आम तौर पर कर रही लायक है।

+7

तो मेरे .bashrc में सेट करने के लिए लायक/सुरक्षित है? – hardcode57

+5

@ hardcode57 हां। –

2

एक के शेल व्यक्ति होने के नाते, मैं पर extglob मेरी .bashrc में डिफ़ॉल्ट रूप से, क्योंकि है कि जिस तरह से यह के शेल में है, और मैं इसे एक बहुत का उपयोग करें।

उदाहरण के लिए:

$ find !(target) -name "*.xml" 

के शेल में, यह कोई समस्या नहीं है। बाश में, मुझे extglob सेट करने की आवश्यकता है। मैंने lithist और set -o vi भी सेट किया है। यह मुझे मेरे खोल इतिहास का उपयोग करने में VI आदेशों का उपयोग करने की अनुमति देता है, और जब मैंने v मारा, तो यह मेरे कोड को लाइनों के समूह के रूप में दिखाता है।

lithist बिना सेट:

for i in *;do;echo "I see $i";done 

साथ listhist सेट:

for i in * 
do 
    echo "I see $i" 
done 

अब, केवल तभी मार print बयान था, मैं पूरी तरह से तैयार हो जाएगा।

+2

गूंज के लिए बैश का पसंदीदा प्रतिस्थापन 'printf' का थोड़ा विस्तारित संस्करण है, जो ksh _does_ भी है ... –

+1

@ चार्ल्स डफी हाँ, मुझे' printf' के बारे में पता है। मेरी समस्या आदत है। मैं 1 9 80 के दशक से कॉर्नशेल लिपि लिख रहा था। आदत कहती है जब मैं कमांड लाइन पर एक त्वरित खोल स्क्रिप्ट लिखता हूं, 'प्रिंट' का उपयोग करें और 'echo' नहीं। बाश और केएसएच लगभग 98% संगत हैं। यह मुझे पागल ड्राइव करने के लिए बस इतना है। मैं विभिन्न भाषाओं के बीच स्विच कर सकता हूं क्योंकि वाक्यविन्यास अलग है। बाश केएसएच की तरह पर्याप्त है कि मैं भूल जाता हूं कि मैं बाश का उपयोग कर रहा हूं और केएसएच नहीं। फिर मैं 'आर वी' या 'सीडी फू बार' जैसे कॉर्निज्म आज़माता हूं, और बाश ने इसे अस्वीकार कर दिया है। Grrrr ... –

+1

@ डेविडडब्ल्यू। - मैंने कई साल पहले परिवर्तित किया था, और इससे पहले कि मुझे अपनी स्क्रिप्ट लाइब्रेरी पर पोर्ट किया गया था, मेरे पास बहुत सारे बग-फॉर-बग-संगत क्षीम्स थे जो कार्यों के रूप में कार्यान्वित किए गए थे- 'प्रिंट', 'कहां', आदि। लेकिन मैंने उन लोगों को छोड़ दिया है बैसाखी। की अभिव्यक्ति! विस्तार से मुझे आश्चर्य हुआ है कि मुझे कभी भी 'आर'/'एफसी' के साथ कैसे मिला। –

संबंधित मुद्दे