आश्चर्यजनक रूप से, कंप्यूटर को मनुष्यों को पठनीय आउटपुट देना कोई आसान काम नहीं है। मानक स्ट्रीम की शुरुआत और विशेष रूप से मानक आउटपुट के साथ, प्रोग्राम को प्लेन टेक्स्ट स्ट्रीम का उपयोग करके एक-दूसरे से बात करने का एक तरीका मिला। लेकिन stdout को मानवीय बनाना और प्रदर्शित करना एक अलग मामला है। कंप्यूटिंग युग के दौरान प्रौद्योगिकी ने इस समस्या को हल करने की कोशिश की है, वीडियो कंप्यूटर डिस्प्ले में ASCII कैरेक्टर के उपयोग से लेकर आधुनिक शेल कमांड जैसे echo और printf तक।
ये प्रगति निर्बाध नहीं रही है। टर्मिनल पर आउटपुट प्रिंट करने का काम प्रोग्रामर्स के लिए विचित्रताओं से भरा हुआ है, जैसा कि एस्केप सीक्वेंस का विस्तार करके नई लाइन प्रिंट करने के भ्रामक रूप से गैर-तुच्छ कार्य द्वारा उदाहरणित है। प्लेसहोल्डर \n के विस्तार को कई तरीकों से पूरा किया जा सकता है, प्रत्येक का अपना अनूठा इतिहास और जटिलताएं हैं।
echo का उपयोग करना
Multics में इसकी उपस्थिति से लेकर आधुनिक Unix-जैसे सिस्टम में इसकी सर्वव्यापकता तक, echo आपके टर्मिनल को "Hello world!" कहलवाने के लिए एक परिचित टूल बना हुआ है। दुर्भाग्य से, ऑपरेटिंग सिस्टम में असंगत कार्यान्वयन इसके उपयोग को मुश्किल बनाते हैं। जहां कुछ सिस्टम पर echo स्वचालित रूप से एस्केप सीक्वेंस का विस्तार करेगा, अन्य को ऐसा करने के लिए -e विकल्प की आवश्यकता होती है:
echo "the study of European nerves is \neurology"
# the study of European nerves is \neurology
echo -e "the study of European nerves is \neurology"
# the study of European nerves is
# eurology
कार्यान्वयन में इन असंगतियों के कारण, echo को नॉन-पोर्टेबल माना जाता है। इसके अतिरिक्त, कमांड सब्स्टीट्यूशन का उपयोग करके शेल इंजेक्शन अटैक के माध्यम से उपयोगकर्ता इनपुट के साथ इसका उपयोग अपेक्षाकृत आसानी से दूषित हो सकता है।
आधुनिक सिस्टम में, यह केवल उन कई प्रोग्रामों के साथ संगतता प्रदान करने के लिए रखा गया है जो अभी भी इसका उपयोग करते हैं। POSIX विनिर्देश नए प्रोग्राम में printf के उपयोग की सिफारिश करता है।
printf का उपयोग करना
4th Edition Unix के बाद से, पोर्टेबल printf कमांड अनिवार्य रूप से नया और बेहतर echo रहा है। यह आपको इनपुट को मानवीय बनाने के लिए फॉर्मेट स्पेसिफायर का उपयोग करने की अनुमति देता है। बैकस्लैश एस्केप सीक्वेंस की व्याख्या करने के लिए, %b का उपयोग करें। कैरेक्टर सीक्वेंस \n यह सुनिश्चित करता है कि आउटपुट नई लाइन के साथ समाप्त हो:
printf "%b\n" "Many females in Oble are \noblewomen"
# Many females in Oble are
# oblewomen
हालांकि printf में आगे के विकल्प हैं जो इसे echo का कहीं अधिक शक्तिशाली प्रतिस्थापन बनाते हैं, यह उपयोगिता फूलप्रूफ नहीं है और अनियंत्रित फॉर्मेट स्ट्रिंग अटैक की चपेट में आ सकती है। प्रोग्रामर्स के लिए यह महत्वपूर्ण है कि वे सुनिश्चित करें कि वे उपयोगकर्ता इनपुट को सावधानी से संभालते हैं।
वेरिएबल में नई लाइन डालना
कंपाइलर्स के बीच पोर्टेबिलिटी में सुधार के प्रयास में, ANSI C मानक 1983 में स्थापित किया गया था। ANSI-C कोटिंग का उपयोग करके $'...', एस्केप सीक्वेंस को मानक के अनुसार आउटपुट में प्रतिस्थापित किया जाता है।
यह हमें स्ट्रिंग्स को नई लाइन के साथ वेरिएबल में संग्रहीत करने की अनुमति देता है जो नई लाइन की व्याख्या के साथ प्रिंट होती हैं। आप वेरिएबल सेट करके, फिर इसे printf के साथ $ का उपयोग करके कॉल करके ऐसा कर सकते हैं:
puns=$'\number\narrow\nether\nice'
printf "%b\n" "These words started with n but don't make $puns"
# These words started with n but don't make
# umber
# arrow
# ether
# ice
विस्तारित वेरिएबल सिंगल-कोटेड है, जिसे printf को शाब्दिक रूप से पास किया जाता है। हमेशा की तरह, इनपुट को ठीक से संभालना महत्वपूर्ण है।
बोनस राउंड: शेल पैरामीटर विस्तार
Bash और ब्रेसेस की व्याख्या करने वाले मेरे लेख में, मैंने शेल पैरामीटर विस्तार के जादू को कवर किया था। हम एक विस्तार, ${parameter@operator}, का उपयोग एस्केप सीक्वेंस की व्याख्या करने के लिए भी कर सकते हैं। हम printf के %s स्पेसिफायर का उपयोग स्ट्रिंग के रूप में प्रिंट करने के लिए करते हैं, और E ऑपरेटर हमारे वेरिएबल में एस्केप सीक्वेंस को ठीक से विस्तारित करेगा:
printf "%s\n" ${puns@E}
# umber
# arrow
# ether
# ice
मनुष्यों की भाषा में बात करने की निरंतर चुनौती
स्ट्रिंग इंटरपोलेशन प्रोग्रामर्स के लिए एक चबाने वाली समस्या बनी हुई है। भाषाओं और शेल को इस बात पर सहमत करने के अलावा कि कुछ प्लेसहोल्डर का क्या अर्थ है, सही एस्केप सीक्वेंस का उचित उपयोग करने के लिए विस्तार पर नजर रखने की आवश्यकता होती है।
खराब स्ट्रिंग इंटरपोलेशन मूर्खतापूर्ण दिखने वाले आउटपुट का कारण बन सकता है, साथ ही सुरक्षा कमजोरियों को भी पेश कर सकता है, जैसे इंजेक्शन अटैक से। जब तक टर्मिनल के अगले विकास में हम इमोजी में बात नहीं कर रहे, हम मनुष्यों के लिए आउटपुट प्रिंट करते समय ध्यान देना सबसे अच्छा है।