ক্যোটিং

দুটো উদাহরণ দেখা যাক:

me@howtocode-pc:~$ echo শেষ শব্দটি লেখার আগে আমি অনেকগুলো স্পেস দেবো।
শেষ শব্দটি লেখার আগে আমি অনেকগুলো স্পেস দেবো।
me@howtocode-pc:~$ echo The total is $100.00
The total is 00.00

প্রথম উদাহরণে আমি অনেকগুলো স্পেস দিয়েছি ঠিকই কিন্তু echo সেগুলো ধর্তব্যে আনেনি। দ্বিতীয়টিতে আমি ১০০ডলার লিখতে চেয়েছিলাম কিন্তু শুরুতে '$' থাকায় শেল '$1' কে ভেরিয়েবল হিসেবে বিবেচনা করেছে এবং তার কোনো মান শেলের জানা নেই বলে কিছুই বসায়নি। এই সমস্তকিছুই এক্সপ্যানসনের ফল। এমন অবস্থা আসতে পারে যখন আমরা এক্সপ্যানসন চাই না। তখন আমরা তা বন্ধকরতে পারি ক্যোটিং(quoting) এর মাধ্যমে। ক্যোটিং এর জন্য দুটি চিহ্ন ব্যবহৃত হয়। সিঙ্গেল ক্যোট(') ও ডবল ক্যোট("")।

ডবল ক্যোট

যখন আপনি কোনো আর্গুমেন্টকে ডবলক্যোট("") দিয়ে আবদ্ধ করবেন শেলে যেসব চিহ্নের বিশেষ কোনো অর্থবহন করে সেগুলো তাদের অর্থ হারাবে অর্থাৎ সাধারন অক্ষরের মত ব্যবহৃত হবে। শুধুমাত্র "$", "\" এবং "`" এর ব্যতিক্রম। আমরা বরং একটা ছক থেকে দেখে নিই কোন কোন শেলফিচারগুলো ডবল ক্যোটে নিস্ক্রিয় থাকবে আর কোনগুলো সক্রিয়:

ফিচার

সক্রিয়তা/নিস্ক্রিয়তা

মন্তব্য

ওয়ার্ড-স্প্লিটিং

নিস্ক্রিয়

আর্গুমেন্ট হিসেবে দেয়া শব্দগুলো স্পেস দিয়ে আলাদা হলে তাদের আলাদা আলাদা গন্য করা হত। ডবল ক্যোটের মধ্যে থাকা স্পেসগুলোর জন্য তেমন হবে না।

পাথনেম এক্সপ্যানসন

নিস্ক্রিয়

ওয়াইল্ডকার্ড ব্যবহার করে আমরা যে পাথনেম এক্সপ্যানসন করি তা নিস্ক্রিয় থাকবে।

টিল্ডে এক্সপ্যানসন

নিস্ক্রিয়

টিল্ডে চিহ্ন(~) আমরা হোমের বদলে ব্যবহার করতাম, এটি নিস্ক্রিয় থাকবে।

ব্রেস এক্সপ্যানসন

নিস্ক্রিয়

ব্রেস এক্সপ্যানসন নিস্ক্রিয় থাকবে।

প্যারামিটার এক্সপ্যানসন

সক্রিয়

$ ব্যবহার করে প্যারামিটার এক্সপ্যানসন করতে হয় তাই এটি সক্রিয় থাকবে।

গানিতিক এক্সপ্যানসন

সক্রিয়

গানিতিক এক্সপ্যানসনও $ এর উপর নির্ভরশীল বলে এটিও সক্রিয় থাকবে।

কমান্ড সাবস্টিটিউশন

সক্রিয়

এটিও $ এর উপর নির্ভরশীল তাই এটিও কাজ করবে।

এবার দেখা যাক কেন ও কখন ডবল ক্যোট ব্যবহার করবো। আপনি ফাইল ম্যানেজার দিয়ে হোমে যান এবং দেখুন Untitled Folder নামে কোনো ফোল্ডার আছে কিনা। না থাকলে একটা নতুন ফোল্ডার তৈরি করুন, কোনো নাম না দিলে এই নামটিই ব্যবহার করবে। এবার টার্মিনালে লিখুন:

me@howtocode-pc:~$ ls -l Untitled Folder
ls: cannot access Untitled: No such file or directory
ls: cannot access Folder: No such file or directory
me@howtocode-pc:~$ mv "Untitled Folder" Untitled_Folder

আমরা কেবলই Untitled Folder ফোল্ডারটি তৈরি করেছি। কিন্তু আমরা যখন কমান্ডলাইনে ls -l কমান্ডের সাথে আর্গুমেন্ট হিসেবে ফোল্ডারটির নাম দিয়েছি মাঝখানে স্পেস থাকার কারনে ওয়ার্ড-স্প্লিটিং ঘটেছে। ফলে Untitled ও Folder নামে দুটো আর্গুমেন্ট তৈরি হয়েছে এবং কোনোটাই পাওয়া যায়নি।

লিনাক্স ট্রাডিশনে যারা কমান্ডলাইনে কাজ করেন তারা ফোল্ডারগুলোর নামের মধ্যে স্পেসের বদলে আন্ডারস্কোর(_) ক্যারেক্টার ব্যবহার করেন দ্রুত কাজ করার সুবিধার্থে। আমরা তাই Untitled Folder থেকে নাম পরিবর্তন করে Untitled_Folder করেছি যেন বারবার এই সমস্যায় পড়তে না হয়।

আমরা জেনেছি প্যারামিটার এক্সপ্যানসন, গানিতিক এক্সপ্যানসন ও কমান্ড সাবস্টিটিউশন কাজ করবে। একটা উদাহারণ দেখা যাক:

me@howtocode-pc:~$ echo "$USER $((2+2)) $(cal)"
me 4 September 2014
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

আমরা echo কমান্ডের আর্গুমেন্ট হিসেবে "$USER $((2+2)) $(cal)" ব্যবহার করেছি। যার প্রথমে ছিল USER ভেরিয়েবল যার সামনে $ ব্যবহার করে $USER লিখেছি প্যারামিটার এক্সপ্যানসন এর জন্য। ফলে আউটওপুটের প্রথম লাইণে আমরা 'me' দেখতে পাচ্ছি যেটা আমার ইউজারনেম। এরপর আমরা একটা ম্যাথ এক্সপ্যানসন দিয়েছি: $((2+2))। যার উত্তর 4 সেটিও প্রিন্ট করেছে 'me' এর পরেই। তারপর আমরা cal কমান্ডের সাবস্টিটিউশন করেছি যা তারপরেই প্রিন্ট হয়েছে।

আমরা আগের লেসনে একটি উদাহরণ দেখেছিলাম:

me@howtocode-pc:~$ echo শেষ শব্দটি লেখার আগে আমি অনেকগুলো স্পেস দেবো।
শেষ শব্দটি লেখার আগে আমি অনেকগুলো স্পেস দেবো।

দেখুন, আমাদের অতিরিক্ত স্পেস কিন্তু দেখায়নি। কারনটা কি? কারনটা হল প্রথমে শেল যখন সম্পুর্ন কমান্ডটি আমাদের কাছে পেল‌ো। সে সবগুলো স্পেস কে ভেবে নিল আর্গুমেন্ট গুলো আলাদা করার উপায়। যাকে ডিলিমিটারস বলে। অতএব তার কাছে 'শেষ', 'শব্দটি', 'লেখার'... এরকম সব শব্দগুলো আলাদা আলাদা আর্গুমেন্ট হয়ে গেলো। শেলের এই ফিচারকে ওয়ার্ড-স্প্লিটিং বলে। শেল শব্দগুলোকে শুধু, স্পেসগুলো বাদে আলাদা আলাদা আর্গুমেন্ট হিসেবে echo কমান্ডের কাছে পাঠালো। আর echo তার আর্গুমেন্টগুলো প্রিন্ট করার সময় তাদের মাঝে স্পেস দেয়। এবার আমরা যদি সম্পুর্ণ আর্গুমেন্টটাকে ডবল ক্যোটে আবদ্ধ করে দেই তাহলে কিন্তু যেমন লিখেছি তেমনই দেখাবে:

me@howtocode-pc:~$ echo "শেষ শব্দটি লেখার আগে আমি অনেকগুলো স্পেস দেবো।"
শেষ শব্দটি লেখার আগে আমি অনেকগুলো স্পেস দেবো।

সিঙ্গেল ক্যোট

আমরা ডবল ক্যোটের ক্ষেত্রে দেখেছি কিছউ কিছু এক্সপ্যানসন সক্রিয় থাকে। কিন্তু আমরা যদি সকলরকমের এক্সপ্যানসন নিস্ক্রিয় করতে চাই তাহলে সিঙ্গেল ক্যোট(') ব্যবহার করতে পারি। আমরা একটি echo কমান্ডের আর্গুমেন্টকে আলাদা আলাদাভাবে স্বাভাবিকভাবে এবং ডবল ক্যোট ও সিঙ্গেল ক্যোটে আবদ্ধ করলে পার্থক্যটি বুঝতে পারবো:

me@howtocode-pc:~$ echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
text /home/me/ls-output.txt /home/me/ls.txt a b foo 4 me
me@howtocode-pc:~$ echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
text ~/*.txt {a,b} foo 4 me
me@howtocode-pc:~$ echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER

প্রথমে আমরা স্বাভাবিকভাবে me@howtocode-pc:~$ echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER কমান্ডটি দিয়েছি। এখানে প্রথমে পাথনেম এক্সপ্যানসন, তারপর ব্রেস এক্সপ্যানসন, তারপর কমান্ড সাবস্টিটিউশন, গানিতিক এক্সপ্যানসন ও প্যারামিটার এক্সপ্যানসন সবই হয়েছে। তারপর আমরা আর্গুমেন্টটিকে ডবল ক্যোটে আবদ্ধ করে দিয়েছি। ফলে পাথনেম এক্সপ্যানসন ও ব্রেস এক্সপ্যানসন ঘটেনি কিন্তু কমান্ড সাবস্টিটিউশন, গানিতিক এক্সপ্যানসন ও প্যারামিটার এক্সপ্যানসন ঘটেছে। শেষ উদাহরনে আমরা আর্গুমেন্ট সিঙ্গেল ক্যোটে আবদ্ধ করেছি ফলে কোনো এক্সপ্যানসনই হয়নি।