मैक पर, डिफ़ॉल्ट zsh शेल को कमांड चलने से पहले वाइल्डकार्ड पैटर्न का विस्तार करने से रोकने के लिए उसे सिंगल कोट्स में रखें। उदाहरण के लिए, printf '%s\n' '*.csv' मूल टेक्स्ट *.csv को एक तर्क (आर्ग्यूमेंट) के रूप में पास करता है। शेल द्वारा कोट्स हटा दिए जाते हैं; तारांकन चिह्न प्रोग्राम तक पहुँच जाता है। यदि प्रोग्राम स्वयं पैटर्न का उपयोग करता है, तो वह बाद में उस तारांकन चिह्न की व्याख्या कर सकता है।

कमांड चलने से पहले वाइल्डकार्ड क्यों बदल जाता है

जब आप टर्मिनल में कोई कमांड दर्ज करते हैं, तो शेल प्रोग्राम शुरू करने से पहले उसके तर्कों (आर्ग्यूमेंट्स) को प्रोसेस करता है। zsh में, एक बिना कोट किया गया * फ़ाइल नाम निर्माण (filename generation) को ट्रिगर कर सकता है: शेल पैटर्न के स्थान पर मेल खाने वाले फ़ाइल नामों को प्रतिस्थापित कर देता है। यदि कोई मेल नहीं मिलता है, तो zsh आम तौर पर एक त्रुटि (error) की रिपोर्ट करता है, हालांकि शेल विकल्प उस व्यवहार को बदल सकते हैं। zsh मैनुअल फ़ाइल नाम निर्माण और इसके नो-मैच व्यवहार का वर्णन करता है।

Apple टर्मिनल में zsh को डिफ़ॉल्ट शेल के रूप में निर्दिष्ट करता है, हालांकि मैक को किसी अन्य शेल का उपयोग करने के लिए कॉन्फ़िगर किया जा सकता है। Apple की टर्मिनल गाइड डिफ़ॉल्ट और इसे बदलने के तरीके के बारे में बताती है। नीचे दी गई सिंगल-कोट विधि zsh और Bash के लिए उपयुक्त है; यदि आप किसी भिन्न शेल का उपयोग करते हैं, तो उसके मैनुअल की जाँच करें क्योंकि कोटिंग के नियम भिन्न हो सकते हैं।

मूल वाइल्डकार्ड के लिए सिंगल कोट्स का उपयोग करें

वाइल्डकार्ड पैटर्न को सिंगल कोट चिह्नों के बीच टाइप करें, और उससे संबंधित किसी भी अन्य वर्ण (कैरेक्टर) को सुरक्षित रखें। उदाहरण के लिए:

printf '%s\n' '*.csv'

आउटपुट मूल *.csv होता है, भले ही वर्तमान डायरेक्टरी में CSV फ़ाइलें हों या न हों। printf पैटर्न को एक तर्क के रूप में प्राप्त करता है और उसे प्रिंट करता है; शेल तारांकन चिह्न का विस्तार नहीं करता है। कोट्स शेल सिंटैक्स हैं, इसलिए वे तर्क में शामिल नहीं होते हैं। Apple की शेल स्क्रिप्टिंग गाइड बताती है कि सिंगल कोट्स कोटेड टेक्स्ट के भीतर शेल विस्तार को अक्षम कर देते हैं। Apple: Flow Control, Expansion, and Parsing।

यह विशेष रूप से तब महत्वपूर्ण होता है जब कोई प्रोग्राम स्वयं पैटर्न को संभालने की अपेक्षा करता है। macOS पर, उदाहरण के लिए, find -name को दिए गए पैटर्न का उपयोग करके फ़ाइल नामों का मिलान कर सकता है:

find . -type f -name '*.log'

यहाँ, शेल *.log को बिना किसी बदलाव के find को पास करता है; फिर find वर्तमान डायरेक्टरी के अंतर्गत फ़ाइलों पर अपना फ़ाइल नाम मिलान लागू करता है। कोटिंग, find द्वारा इसका उपयोग किए जाने से पहले शेल को पैटर्न को वर्तमान डायरेक्टरी के नामों से बदलने से रोकती है। पैटर्न का अर्थ प्राप्त करने वाले प्रोग्राम पर निर्भर करता है: शेल कोटिंग शेल विस्तार को नियंत्रित करती है, न कि इस बात को कि प्रोग्राम अपने तर्क की व्याख्या कैसे करता है।

बैकस्लैश का उपयोग कब करें

छोटे पैटर्न के लिए, एक बैकस्लैश कोट्स के बाहर किसी व्यक्तिगत वाइल्डकार्ड की सुरक्षा कर सकता है:

printf '%s\n' \*.csv

यह भी तारांकन चिह्न को मूल रूप में ही पास करता है। जब किसी पैटर्न में कई विशेष वर्ण, रिक्त स्थान (स्पेस) या ब्रैकेट होते हैं, तो सिंगल कोट्स को पढ़ना अक्सर आसान होता है। उदाहरण के लिए, 'chapter [0-9]*.txt' ब्रैकेट और वाइल्डकार्ड को शेल द्वारा व्याख्यायित होने से रोकता है। Apple अपनी शेल स्क्रिप्टिंग गाइड में बैकस्लैश कोटिंग और सिंगल-कोट व्यवहार का दस्तावेजीकरण करता है।

कोटिंग की सामान्य गलतियाँ

डबल कोट्स प्रत्येक शेल वर्ण की विश्वसनीय रूप से सुरक्षा नहीं करते हैं। वे zsh में वाइल्डकार्ड विस्तार को रोकते हैं, लेकिन फिर भी कुछ विस्तारों की अनुमति देते हैं, जिनमें $name जैसे वेरिएबल्स और $(command) जैसे कमांड प्रतिस्थापन शामिल हैं। उस पैटर्न के लिए जिसे ठीक वैसे ही पहुंचना चाहिए जैसा टाइप किया गया है, सिंगल कोट्स का उपयोग करें जब तक कि तर्क को उन विस्तारों में से किसी एक की आवश्यकता न हो।

सिंगल-कोटेड स्ट्रिंग के अंदर एक सिंगल कोट साधारण वर्ण के रूप में प्रकट नहीं हो सकता है। यदि पैटर्न में ही कोई एपॉस्ट्रॉफी (apostrophe) है, तो कोट किए गए हिस्से को बंद करें, किसी अन्य कोटिंग विधि का उपयोग करके एपॉस्ट्रॉफी जोड़ें, और सिंगल कोट्स को फिर से खोलें; Apple अपनी गाइड में इस शेल कोटिंग तकनीक को दिखाता है। असामान्य पैटर्न के लिए, कमांड को चलाने से पहले उसका सावधानीपूर्वक निरीक्षण करें।

शेल विस्तार और प्राप्त करने वाले प्रोग्राम के व्यवहार के बीच भी अंतर करें। *.log को कोट करना किसी प्रोग्राम को तारांकन चिह्न को एक सामान्य वर्ण के रूप में मानने के लिए बाध्य नहीं करता है; यह केवल यह सुनिश्चित करता है कि शेल इसे बिना बदले आगे पास कर दे। find -name जैसी उपयोगिता (utility) इसे एक पैटर्न के रूप में व्याख्यायित कर सकती है, जबकि कोई अन्य कमांड इसे सामान्य टेक्स्ट मान सकती है। जब यह अंतर मायने रखता हो, तो उस कमांड के अपने दस्तावेज़ (documentation) की जाँच करें।

रिटर्न (Return) दबाने से पहले एक त्वरित जाँच

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

स्रोत