কম্পিউটার টিউটোরিয়াল

Bash কমান্ড চেইনিং: সেমিকোলন এবং কন্ট্রোল অপারেটর ব্যবহার

সিম্পল কম্পাউন্ড কমান্ড—যেমন কমান্ড লাইনে একাধিক কমান্ড সিকোয়েন্সে একসাথে রান করা—বেশি ব্যবহৃত হয়। এগুলো সেমিকোলন দিয়ে আলাদা করা হয়, যা একটি কমান্ডের শেষ নির্দেশ করে। শেল কমান্ডের একটি সিম্পল সিরিজ একই লাইনে চালাতে হলে প্রতিটি কমান্ডকে সেমিকোলন দিয়ে আলাদা করুন:

command1 ; command2 ; command3 ; command4 ; 

ফাইনাল সেমিকোলন দরকার নেই কারণ Enter কী প্রেস করলে লাস্ট কমান্ডের শেষ বোঝায়, কিন্তু কনসিস্টেন্সির জন্য দিয়ে দিলে কোনো সমস্যা নেই।

সব কমান্ড مشكلة ছাড়া চলে—যদি কোনো এরর না হয়। কিন্তু এরর হলে কী হবে? আমরা Bash-বিল্ট-ইন && এবং || কন্ট্রোল অপারেটর দিয়ে এরর অ্যান্টিসিপেট ও হ্যান্ডেল করতে পারি। এই দুটি কন্ট্রোল অপারেটর কিছু ফ্লো কন্ট্রোল প্রদান করে এবং কোড এক্সিকিউশন সিকোয়েন্স পরিবর্তন করতে সক্ষম করে। সেমিকোলন এবং নিউলাইন ক্যারেক্টরও Bash কন্ট্রোল অপারেটর হিসেবে বিবেচিত।

&& অপারেটর বোঝায় "যদি command1 সফল হয়, তাহলে command2 চালাও।" command1 কোনো কারণে ফেইল করলে command2 চলেगा না। সিন্ট্যাক্স:

command1 && command2

এটি কাজ করে কারণ প্রতিটি কমান্ড শেলে একটি রিটার্ন কোড ফেরত দেয় যা সফলতা বা ব্যর্থতা নির্দেশ করে। কনভেনশন অনুযায়ী, রিটার্ন কোড (RC) ০ (শূন্য) = সফলতা, এবং যেকোনো পজিটিভ নম্বর = কোনো না কোনো ফেইলার। কিছু সিস্টেম অ্যাডমিন টুল শুধু ১ রিটার্ন করে যেকোনো ফেইলারের জন্য, কিন্তু অনেক টুল বিভিন্ন পজিটিভ কোড দিয়ে ফেইলার টাইপ নির্দেশ করে।

Bash শেলের $? ভেরিয়েবল খুব সহজে চেক করা যায়—স্ক্রিপ্ট দ্বারা, কমান্ড লিস্টের পরের কমান্ড দ্বারা, বা সরাসরি সিস্টেম অ্যাডমিন দ্বারা। RC দেখতে একটা সিম্পল কমান্ড চালান এবং অবিলম্বে RC চেক করুন, যা সবসময় লাস্ট রান করা কমান্ডের് রেফার করে।

[student@studentvm1 ~]$ ll ; echo "RC = $?"
 total 284
 -rw-rw-r-- 1 student student 130 Sep 15 16:21 ascii-program.sh
 drwxrwxr-x 2 student student 4096 Nov 10 11:09 bin
 <snip>
 drwxr-xr-x. 2 student student 4096 Aug 18 10:21 Videos
 RC = 0
 [student@studentvm1 ~]$

RC ০ মানে কমান্ড সফলভাবে সম্পন্ন। এখন পারমিশন নেই এমন ডিরেক্টরিতে একই কমান্ড চান।

[student@studentvm1 ~]$ ll /root ; echo "RC = $?"
 ls: cannot open directory '/root': Permission denied
 RC = 2
 [student@studentvm1 ~]$

RC-এর অর্থ ls কমান্ডের ম্যান পেজে পাওয়া যাবে।

&& কন্ট্রোল অপারেটর কিভাবে কমান্ড-লাইন প্রোগ্রামে ব্যবহার করা যায় তা দেখি। সিম্পল কিছু: একটি নতুন ডিরেক্টরি তৈরি করুন এবং সফল হলে সেখানে একটি নতুন ফাইল তৈরি করুন।

আমাদের একটি ডিরেক্টরি দরকার যেখানে সাব-ডিরেক্টরি তৈরি করা যাবে। প্রথমে হোম ডিরেক্টরিতে একটি টেম্পোরারি ডিরেক্টরি তৈরি করুন টেস্টের জন্য।

[student@studentvm1 ~]$ cd ; mkdir testdir

~/testdir-এ একটি নতুন ডিরেক্টরি তৈরি করুন (যেটি খালি হওয়া উচিত কারণ আপনি এখনই তৈরি করেছেন), এবং সেখানে একটি নতুন খালি ফাইল তৈরি করুন। নিচের কমান্ড দুটি কাজ করবে:

[student@studentvm1 ~]$ mkdir ~/testdir/testdir2 && touch ~/testdir/testdir2/testfile1
 [student@studentvm1 ~]$ ll ~/testdir/testdir2/
 total 0
 -rw-rw-r-- 1 student student 0 Nov 12 14:13 testfile1
 [student@studentvm1 ~]$

সবকিছু ঠিকঠাক কাজ করলো কারণ testdir অ্যাক্সেসিবল এবং রাইটেবল। এখন testdir-এর পারমিশন পরিবর্তন করে student ইউজারের জন্য অ্যাক্সেসবility সরিয়ে দিন:

[student@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
 d---rwxrw-. 3 student student 4096 Nov 12 14:13 testdir
 [student@studentvm1 ~]$

ll (লং লিস্ট)-এর পর grep দিয়ে testdir-এর লিস্টিং দেখানো হয়েছে। দেখুন student ইউজারের testdir-এ আর অ্যাক্সেস নেই। এখন প্রায় একই কমান্ড চালান কিন্তু testdir-এর ভেতরে ভিন্ন নামের ডিরেক্টরি তৈরি করার চেষ্টা করুন:

[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1
 mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
 [student@studentvm1 ~]$

যদিও ইরর মেসেজ পেলাম, && কন্ট্রোল অপারেটর touch কমান্ডটি চালাতে দেনি কারণ testdir3 তৈরি করতে ফেইল করলো। এই ধরনের কমান্ড-লাইন লজিক্যাল ফ্লো কন্ট্রোল এরর কম্পাউন্ড হয়ে বড় গোলমাল থেকে বাঁচায়। একটু জটিল করি।

|| কন্ট্রোল অপারেটর আমাদের একটি অতিরিক্ত কমান্ড যোগ করতে দেয় যা ইনিশিয়াল প্রোগ্রাম স্টেটমেন্ট শূন্য বড় রিটার্ন কোড ফেরত দিলে এক্সিকিউট হবে।

[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1 || echo "An error occurred while creating the directory."
 mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
 An error occurred while creating the directory.
 [student@studentvm1 ~]$ 

ফ্লো কন্ট্রোলের সাথে আমাদের কম্পাউন্ড কমান্ড সিন্ট্যাক্স এই জেনারেল ফর্মে:

preceding commands ; command1 && command2 || command3 ; following commands

ফ্লো-কন্ট্রোল সেকশনের আগে ও পরে অন্যান্য কমান্ড থাকতে পারে যা ফ্লো কন্ট্রোল সেকশনের কমান্ডগুলোর সাথে সম্পর্কিত হতে পারে কিন্তু ফ্লো কন্ট্রোলের প্রভাব থেকে বাহির। সেগুলো ফ্লো-কন্ট্রোল কম্পাউন্ড কমান্ডের মধ্যে যা কিছু হোক সেটা না দেখে এক্সিকিউট হবে।

এই ফ্লো-কন্ট্রোল অপারেটরগুলো কমান্ড লাইনে কাজ কে বেশি দক্ষ করে তোলে ডিসিশন হ্যান্ডল করে এবং সমস্যা হলে আমাদের জানায়। আমি এগুলো সরাসরি কমান্ড লাইনে এবং স্ক্রিপ্টে ব্যবহার করি।

রুট ইউজার হিসেবে ক্লিন আপ করুন ডিরেক্টরি এবং এর কন্টেন্ট ডিলিট করতে।

[root@studentvm1 ~]# rm -rf /home/student/testdir

আপনি Bash কন্ট্রোল অপারেটর কীভাবে ব্যবহার করেন? কমেন্ট সেকশনে জানান।

  1. লিনাক্স নতুনদের জন্য বেসিক Bash কমান্ড

  2. বাশকে পাইথনে রিপ্লেস করুন: সিস্টেম অ্যাডমিনিস্ট্রেটরদের জন্য আধুনিক কমান্ড-লাইন পছন্দ

  3. লিনাক্স টার্মিনাল মাস্টার করার জন্য অপরিহার্য বাশ কমান্ডস ও টিপস

  4. লিনাক্স কমান্ড চেইনিং মাস্টার করুন: ১০টি অপরিহার্য অপারেটর প্র্যাক্টিক্যাল উদাহরণসহ