हैरानी की बात यह है कि इंसानों को पढ़ने योग्य आउटपुट देने के लिए कंप्यूटर प्राप्त करना कोई आसान उपलब्धि नहीं है। मानक धाराओं और विशेष रूप से मानक आउटपुट की शुरूआत के साथ, कार्यक्रमों ने सादा पाठ धाराओं का उपयोग करके एक दूसरे से बात करने का एक तरीका प्राप्त किया। लेकिन मानवीकरण और स्टडआउट प्रदर्शित करना एक और मामला है। पूरे कंप्यूटिंग युग में प्रौद्योगिकी ने इस समस्या को हल करने की कोशिश की है, वीडियो कंप्यूटर डिस्प्ले में ASCII वर्णों के उपयोग से लेकर आधुनिक शेल कमांड जैसे echo
तक और printf
।
ये प्रगति निर्बाध नहीं रही है। टर्मिनल पर आउटपुट को प्रिंट करने का काम प्रोग्रामर के लिए नेविगेट करने के लिए विचित्रताओं से भरा होता है, जैसा कि न्यूलाइन्स को प्रिंट करने के लिए एस्केप सीक्वेंस का विस्तार करने के भ्रामक रूप से गैर-तुच्छ कार्य द्वारा उदाहरण दिया गया है। प्लेसहोल्डर का विस्तार \n
कई तरीकों से पूरा किया जा सकता है, प्रत्येक का अपना अनूठा इतिहास और जटिलताएं हैं।
echo
का उपयोग करना
मल्टीिक्स में अपनी उपस्थिति से लेकर इसके आधुनिक यूनिक्स जैसी प्रणाली सर्वव्यापकता तक, echo
अपने टर्मिनल को "हैलो वर्ल्ड!" कहने के लिए एक परिचित उपकरण बना हुआ है। दुर्भाग्य से, ऑपरेटिंग सिस्टम में असंगत कार्यान्वयन इसके उपयोग को मुश्किल बनाते हैं। जहां 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
का उपयोग करना
यूनिक्स के चौथे संस्करण के बाद से पोर्टेबल printf
कमांड अनिवार्य रूप से नया और बेहतर रहा है echo
. यह आपको इनपुट को मानवीय बनाने के लिए प्रारूप विनिर्देशकों का उपयोग करने की अनुमति देता है। बैकस्लैश एस्केप अनुक्रमों की व्याख्या करने के लिए, %b
use का उपयोग करें . वर्ण क्रम \n
सुनिश्चित करता है कि आउटपुट एक नई लाइन के साथ समाप्त होता है:
printf "%b\n" "Many females in Oble are \noblewomen"
# Many females in Oble are
# oblewomen
हालांकि printf
इसके और विकल्प हैं जो इसे echo
. का कहीं अधिक शक्तिशाली प्रतिस्थापन बनाते हैं , यह उपयोगिता फुलप्रूफ नहीं है और अनियंत्रित प्रारूप स्ट्रिंग हमले के प्रति संवेदनशील हो सकती है। प्रोग्रामर के लिए यह सुनिश्चित करना महत्वपूर्ण है कि वे उपयोगकर्ता इनपुट को सावधानीपूर्वक संभालें।
नईलाइनों को वेरिएबल में डालना
संकलकों के बीच सुवाह्यता में सुधार करने के प्रयास में, एएनएसआई सी मानक की स्थापना 1983 में की गई थी। एएनएसआई-सी के उद्धरण के साथ $'...'
का उपयोग किया गया था। , एस्केप सीक्वेंस को मानक के अनुसार आउटपुट में बदल दिया जाता है।
यह हमें नई लाइनों के साथ स्ट्रिंग्स को वेरिएबल में स्टोर करने की अनुमति देता है जो कि व्याख्या की गई नईलाइन के साथ मुद्रित होते हैं। आप वैरिएबल को सेट करके, फिर इसे 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
. पर पास किया जाता है . हमेशा की तरह, इनपुट को ठीक से संभालना महत्वपूर्ण है।
बोनस राउंड:शेल पैरामीटर विस्तार
अपने लेख में बैश और ब्रेसिज़ की व्याख्या करते हुए, मैंने शेल पैरामीटर विस्तार के जादू को कवर किया। हम एक विस्तार का उपयोग कर सकते हैं, ${parameter@operator}
, भागने के दृश्यों की व्याख्या करने के लिए भी। हम printf
. का उपयोग करते हैं का %s
एक स्ट्रिंग के रूप में प्रिंट करने के लिए निर्दिष्ट करें, और E
ऑपरेटर हमारे वेरिएबल में एस्केप सीक्वेंस का ठीक से विस्तार करेगा:
printf "%s\n" ${puns@E}
# umber
# arrow
# ether
# ice
मानव में बात करने की चल रही चुनौती
प्रोग्रामर के लिए स्ट्रिंग इंटरपोलेशन एक कठिन समस्या बनी हुई है। कुछ प्लेसहोल्डर्स का क्या मतलब है, इस पर सहमत होने के लिए भाषा और शेल प्राप्त करने के अलावा, सही एस्केप सीक्वेंस का ठीक से उपयोग करने के लिए विवरण के लिए एक आंख की आवश्यकता होती है।
खराब स्ट्रिंग इंटरपोलेशन मूर्खतापूर्ण दिखने वाले आउटपुट को जन्म दे सकता है, साथ ही इंजेक्शन हमलों से सुरक्षा कमजोरियों को भी पेश कर सकता है। जब तक टर्मिनल के अगले विकास में हम इमोजीस में बात नहीं कर रहे हैं, तब तक हम मनुष्यों के लिए आउटपुट प्रिंट करते समय सबसे अच्छा ध्यान देंगे।