আশ্চর্য করুন야마, কম্পিউটারদের মানব পঠনীয় আউটপুট দিতে বাধ্য করা কোনো সহজ কাজ নয়। স্ট্যান্ডার্ড স্ট্রিমস (standard streams) এবং বিশেষত স্ট্যান্ডার্ড আউটপুট (standard output) এর পরিচয়ের সাথে, প্রোগ্রামগুলো প্লেইন টেক্সট স্ট্রিমস (plain text streams) ব্যবহার করে একে অপরের সাথে কথা বলার একটি উপায় পেল। কিন্তু stdout-কে হিউমানাইজ (humanize) এবং ডিসপ্লে করা আরেকটা ব্যাপার। কম্পিউটিং যুগের সাথে সাথে টেকনোলজি এই সমস্যা সমাধান করার চেষ্টা করেছে, ভিডিও কম্পিউটার ডিসপ্লে-এ ASCII ক্যারেক্টার ব্যবহার থেকে আধুনিক শেল কমান্ডস যেন echo এবং printf পর্যন্ত।
এই অগ্রগতিগুলো স্মূথ (seamless) নয়। আউটপুট টার্মিনালে প্রিন্ট করার কাজ প্রোগ্রামারদের নেভিগেট করার জন্য কুয়ার্কস (quirks) দিয়ে ভরা, যেন এস্কেপ সিকোয়েন্স (escape sequence) এক্সপ্যান্ড (expand) করে নিউলাইন প্রিন্ট করার ডসেপ্টিভলি নন-ট্রাইভিয়াল (deceptively nontrivial) টাস্কটা উদাহরণ দিয়ে বোঝানো হয়েছে। প্লেসহোল্ডার \n এক্সপ্যান্ড করা অনেক পথে করা যায়, প্রতিটির নিজস্ব ইতিহাস এবং কমপ্লিকেশন আছে।
echo ব্যবহার করা
Multics-এ এর উপস্থিতি থেকে আধুনিক ইউনিক্স-লাইক (Unix-like) সিস্টেমে इसकी সর্বজনীনতা পর্যন্ত, echo আপনার টার্মিনালকে "Hello world!" বলতে বাধ্য করার একটি পরিচিত টুল। দুর্ভাগ্যক্রমে, অপারেটিং সিস্টেমের মধ্যে ইনকনসিস্টেন্ট (inconsistent) ইমপ্লিমেন্টেশন (implementation) এর কারনে এর ব্যবহার ট্রিকি (tricky)। কিছু সিস্টেমে 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 নন-পোর্টেবল (non-portable) বিবেচিত হয়। এর পাশাপাশি, কম্যান্ড সাবস্টিটিউশন (command substitutions) ব্যবহার করে শেল ইনজেকশন অ্যাটাক (shell injection attack) দিয়ে ইউজার ইনপুটের সাথে এর ব্যবহার সহজে করप্ট (corrupt) করা যায়।
আধুনিক সিস্টেমে, এটি শুধু রক্ষা রক্ষা করা হয়েছে যাতে যেসব প্রোগ্রাম এখনও এটি ব্যবহার করে সেগুলোর সাথে কম্প্যাটিবিলিটি (compatibility) থাকে। POSIX স্পেসিফিকেশন (specification) নতুন প্রোগ্রামগুলোর জন্য printf ব্যবহার করার সুপারিশ করে।
printf ব্যবহার করা
৪র্থ এডিশন ইউনিক্স (4th Edition Unix) থেকে, পোর্টেবল printf কমান্ড আসলেই নতুন এবং উন্নত echo। এটি আপনাকে ফরম্যাট স্পেসিফায়ার (format specifiers) ব্যবহার করে ইনপুট হিউমানাইজ করতে দেয়। ব্যাকস্ল্যাশ এস্কেপ সিকোয়েন্স ইন্টারপ্রেট (interpret) করতে, %b ব্যবহার করুন। ক্যারেক্টার সিকোয়েন্স \n নিশ্চিত করে আউটপুট নিউলাইনে শেষ হয়:
printf "%b\n" "Many females in Oble are \noblewomen" # Many females in Oble are # oblewomen
যদিও printf-এর আরও অপশন আছে যা এটাকে echo-এর চেয়ে कहीं বেশি পাওয়ারফুল রিপ্লেসমেন্ট বানিয়ে দেয়, এই ইউটিলিটিও ফুলপ্রুফ (foolproof) নয় এবং আনকন্ট্রোল্ড ফরম্যাট স্ট্রিং অ্যাটাক (uncontrolled format string attack) এর আশংকা রয়েছে। প্রোগ্রামারদের জন্য গুরুত্বপূর্ণ যে তারা সতর্কতার সাথে ইউজার ইনপুট হ্যান্ডেল করুন।
ভেরিয়েবলসে নিউলাইন রাখা
কম্পাইলারদের মধ্যে পোর্টেবিলিটি (portability) উন্নত করার চেষ্টায়, ANSI C স্ট্যান্ডার্ড ১৯৮৩ সালে প্রতিষ্ঠিত হয়েছিল। ANSI-C কোটিং (quoting) $'...' ব্যবহার করে, এস্কেপ সিকোয়েন্স আউটপুটে স্ট্যান্ডার্ড অনুযায়ী রিপ্লেস (replace) হয়।
এটি আমাদের ニュলাইনসহ স্ট্রিং ভেরিয়েবলসে সংরক্ষণ করতে দেয় যেগুলো নিউলাইন ইন্টারপ্রেট (interpreted) করে প্রিন্ট হয়। আপনি এটি করতে পারেন ভেরিয়েবল সেট করে, তারপর 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
এক্সপ্যান্ডেড ভেরিয়েবলটি সিঙ্গল-কোটেড (single-quoted), যা printf-এ লিটারালি (literally) পাস হয়। সবসময়, ইনপুট সঠিকভাবে হ্যান্ডেল করা গুরুত্বপূর্ণ।
বোনাস রাউন্ড: শেল প্যারামিটার এক্সপ্যানশন (shell parameter expansion)
বাশ এবং ব্রেসেস (braces) ব্যাখ্যা করার আমার আর্টিকেলে, আমি শেল প্যারামিটার এক্সপ্যানশনের ম্যাজিক (magic) কভার করেছিলাম। আমরা একটি এক্সপ্যানশন, ${parameter@operator}, ব্যবহার করতে পারি এস্কেপ সিকোয়েন্স ইন্টারপ্রেট করার জন্যও। আমরা printf-এর %s স্পেসিফায়ার ব্যবহার করি স্ট্রিং হিসেবে প্রিন্ট করার জন্য, এবং E অপারেটর আমাদের ভেরিয়েবলের এস্কেপ সিকোয়েন্সগুলো সঠিকভাবে এক্সপ্যান্ড করবে:
printf "%s\n" ${puns@E} # umber # arrow # ether # ice
মানব ভাষায় কথা বলার চলমান চ্যালেঞ্জ
স্ট্রিং ইন্টারপোলেশন (string interpolation) প্রোগ্রামারদের জন্য একটি চিউই (chewy) সমস্যা বने রয়েছে। ল্যাঙ্গুয়েজ এবং শেলগুলোর মধ্যে নির্দিষ্ট প্লেসহোল্ডারগুলো কী মানে সেটি নিয়ে একমত হওয়া পাশাপাশি, সঠিক এস্কেপ সিকোয়েন্স ব্যবহার করা ডিটেলের দিকে চোখ দিয়ে দেখার চায়।
খারাপ স্ট্রিং ইন্টারপোলেশন मूর্খতাপূর্ণ আউটপুট দিতে পারে, সিকিউরিটি ভালনারেবিলিটি (security vulnerabilities) ও তৈরি করতে পারে, যেন ইনজেকশন অ্যাটাক (injection attacks) থেকে। যতক্ষণ না টার্মিনালের পরবর্তী বিবর্তন আমাদের ইমোজিতে কথা বলতে দেয়, আমরা মানুষের জন্য আউটপুট প্রিন্ট করার সময় মনোযোগ দিয়ে থাকব।