সাধারণ যৌগিক কমান্ড - যেমন কমান্ড লাইনে একটি ক্রমানুসারে কয়েকটি কমান্ডকে একত্রে স্ট্রিং করা - প্রায়শই ব্যবহৃত হয়। এই ধরনের কমান্ড সেমিকোলন দ্বারা পৃথক করা হয়, যা একটি কমান্ডের শেষ সংজ্ঞায়িত করে। একটি একক লাইনে শেল কমান্ডের একটি সাধারণ সিরিজ তৈরি করতে, সেমিকোলন ব্যবহার করে প্রতিটি কমান্ড আলাদা করুন, যেমন:
command1 ; command2 ; command3 ; command4 ;
আপনাকে একটি চূড়ান্ত সেমিকোলন যোগ করার দরকার নেই কারণ এন্টার কী টিপলে চূড়ান্ত কমান্ডের সমাপ্তি বোঝায়, তবে ধারাবাহিকতার জন্য এটি যোগ করা ভালো।
সমস্ত কমান্ড কোনো সমস্যা ছাড়াই চলবে-যতক্ষণ কোনো ত্রুটি না ঘটে। কিন্তু কোন ত্রুটি ঘটলে কি হবে? আমরা && ব্যবহার করে ত্রুটি অনুমান করতে পারি এবং অনুমতি দিতে পারি এবং || কন্ট্রোল অপারেটরগুলি ব্যাশে নির্মিত। এই দুটি নিয়ন্ত্রণ অপারেটর কিছু প্রবাহ নিয়ন্ত্রণ প্রদান করে এবং কোড-নির্বাহের ক্রম পরিবর্তন করতে আমাদের সক্ষম করে। সেমিকোলন এবং নতুন লাইন ক্যারেক্টারকে ব্যাশ কন্ট্রোল অপারেটর হিসেবেও বিবেচনা করা হয়।
&& অপারেটর সহজভাবে বলে "যদি কমান্ড1 সফল হয়, তাহলে কমান্ড 2 চালান।" কমান্ড1 কোনো কারণে ব্যর্থ হলে, কমান্ড 2 চলবে না। সেই সিনট্যাক্স এর মত দেখাচ্ছে:
command1 && command2
এটি কাজ করে কারণ প্রতিটি কমান্ড শেলটিতে একটি কোড ফেরত দেয় যা নির্দেশ করে যে এটি সম্পাদনের সময় সফলভাবে সম্পন্ন হয়েছে নাকি ব্যর্থ হয়েছে। নিয়ম অনুসারে, 0 (শূন্য) এর একটি রিটার্ন কোড (RC) সাফল্য নির্দেশ করে এবং যে কোনও ধনাত্মক সংখ্যা কিছু ধরণের ব্যর্থতা নির্দেশ করে। কিছু sysadmin টুল যেকোন ব্যর্থতা নির্দেশ করার জন্য শুধুমাত্র একটি 1 প্রদান করে, কিন্তু অনেকেই ব্যর্থতার ধরন নির্দেশ করতে অন্যান্য ইতিবাচক সংখ্যাসূচক কোড ব্যবহার করে।
ব্যাশ শেল এর $? পরিবর্তনশীল একটি স্ক্রিপ্ট দ্বারা খুব সহজে চেক করা যেতে পারে, কমান্ডের একটি তালিকার পরবর্তী কমান্ড দ্বারা, এমনকি সরাসরি একটি sysadmin দ্বারা। চলুন RCs তাকান. আমরা একটি সাধারণ কমান্ড চালাতে পারি এবং অবিলম্বে 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 হল 0, যার মানে কমান্ডটি সফলভাবে সম্পন্ন হয়েছে। এখন একটি ডিরেক্টরিতে একই কমান্ড চেষ্টা করুন যেখানে আমাদের অনুমতি নেই৷
৷[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@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
d---rwxrw-. 3 student student 4096 Nov 12 14:13 testdir
[student@studentvm1 ~]$
grep ব্যবহার করে দীর্ঘ তালিকার পরে কমান্ড (ll ) testdir-এর তালিকা দেখায় . আপনি দেখতে পাচ্ছেন যে ব্যবহারকারী ছাত্র৷ testdir-এ আর অ্যাক্সেস নেই ডিরেক্টরি এখন আগের মতোই প্রায় একই কমান্ড চালান কিন্তু testdir-এর ভিতরে একটি ভিন্ন ডিরেক্টরি নাম তৈরি করতে এটি পরিবর্তন করি .
[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1
mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
[student@studentvm1 ~]$
যদিও আমরা && ব্যবহার করে একটি ত্রুটি বার্তা পেয়েছি কন্ট্রোল অপারেটর স্পর্শকে বাধা দেয় চলমান থেকে কমান্ড কারণ 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
আপনি কিভাবে ব্যাশ নিয়ন্ত্রণ অপারেটর ব্যবহার করবেন? কমেন্ট সেকশনে আমাদের জানান।