একটি শেল হল অপারেটিং সিস্টেমের কমান্ড ইন্টারপ্রেটার। ব্যাশ আমার প্রিয় শেল, তবে প্রতিটি লিনাক্স শেল ব্যবহারকারী বা সিস্যাডমিন দ্বারা টাইপ করা কমান্ডগুলিকে অপারেটিং সিস্টেম ব্যবহার করতে পারে এমন একটি ফর্মে ব্যাখ্যা করে। যখন ফলাফলগুলি শেল প্রোগ্রামে ফিরে আসে, তখন এটি সেগুলিকে STDOUT-এ পাঠায় যা ডিফল্টরূপে, টার্মিনালে প্রদর্শন করে। আমি যে সমস্ত শেলগুলির সাথে পরিচিত সেগুলিও হল প্রোগ্রামিং ভাষা৷
ট্যাব সমাপ্তি, কমান্ড-লাইন প্রত্যাহার এবং সম্পাদনার মতো বৈশিষ্ট্য এবং উপনামের মতো শর্টকাটগুলি একটি শক্তিশালী শেল হিসাবে এর মানকে অবদান রাখে। এর ডিফল্ট কমান্ড-লাইন এডিটিং মোড Emacs ব্যবহার করে, কিন্তু আমার প্রিয় ব্যাশ বৈশিষ্ট্যগুলির মধ্যে একটি হল যে আমি ইতিমধ্যেই আমার পেশী মেমরির অংশ এমন সম্পাদনা কমান্ডগুলি ব্যবহার করার জন্য এটিকে Vi মোডে পরিবর্তন করতে পারি।
যাইহোক, আপনি যদি Bash কে শুধুমাত্র একটি শেল হিসাবে ভাবেন, আপনি এর প্রকৃত শক্তির অনেকটাই মিস করবেন। আমার তিন-ভলিউম লিনাক্স স্ব-অধ্যয়ন কোর্সের গবেষণা করার সময় (যার উপর নিবন্ধগুলির এই সিরিজটি ভিত্তি করে), আমি বাশ সম্পর্কে এমন কিছু শিখেছি যা আমি লিনাক্সের সাথে কাজ করার 20 বছরেরও বেশি সময় আগে জানতাম না। এই নতুন জ্ঞানের কিছু বিট প্রোগ্রামিং ভাষা হিসাবে এর ব্যবহার সম্পর্কিত। ব্যাশ একটি শক্তিশালী প্রোগ্রামিং ভাষা, যা কমান্ড লাইনে এবং শেল স্ক্রিপ্টে ব্যবহারের জন্য পুরোপুরি ডিজাইন করা হয়েছে।
এই তিন অংশের সিরিজটি কমান্ড-লাইন ইন্টারফেস (সিএলআই) প্রোগ্রামিং ভাষা হিসাবে ব্যাশ ব্যবহার করে অন্বেষণ করে। এই প্রথম নিবন্ধটি ব্যাশ, ভেরিয়েবল এবং নিয়ন্ত্রণ অপারেটরগুলির সাথে কিছু সাধারণ কমান্ড-লাইন প্রোগ্রামিং দেখে। অন্যান্য নিবন্ধগুলি ব্যাশ ফাইলের প্রকারগুলি অন্বেষণ করে; স্ট্রিং, সংখ্যাসূচক, এবং বিবিধ লজিক্যাল অপারেটর যা এক্সিকিউশন-ফ্লো কন্ট্রোল লজিক প্রদান করে; বিভিন্ন ধরনের শেল সম্প্রসারণ; এবং এর জন্য , যখন , এবং যতক্ষণ loops যা পুনরাবৃত্তিমূলক অপারেশন সক্ষম করে। তারা কিছু কমান্ডের দিকেও নজর দেবে যা এই টুলগুলির ব্যবহারকে সহজ করে এবং সমর্থন করে।
শেল
একটি শেল হল অপারেটিং সিস্টেমের কমান্ড ইন্টারপ্রেটার। ব্যাশ আমার প্রিয় শেল, তবে প্রতিটি লিনাক্স শেল ব্যবহারকারী বা সিস্যাডমিন দ্বারা টাইপ করা কমান্ডগুলিকে অপারেটিং সিস্টেম ব্যবহার করতে পারে এমন একটি ফর্মে ব্যাখ্যা করে। যখন ফলাফলগুলি শেল প্রোগ্রামে ফিরে আসে, তখন এটি তাদের টার্মিনালে প্রদর্শন করে। আমি যে সমস্ত শেলগুলির সাথে পরিচিত সেগুলিও হল প্রোগ্রামিং ভাষা৷
ব্যাশ মানে বোর্ন অ্যাগেইন শেল কারণ ব্যাশ শেলটি 1977 সালে স্টিভেন বোর্নের লেখা পুরানো বোর্ন শেলটির উপর ভিত্তি করে তৈরি। আরও অনেক শেল পাওয়া যায়, তবে এই চারটি হল আমি প্রায়শই মুখোমুখি হই:
- csh: প্রোগ্রামারদের জন্য C শেল যারা C ভাষার সিনট্যাক্স পছন্দ করে
- ksh: কর্ন শেল, ডেভিড কর্নের লেখা এবং ইউনিক্স ব্যবহারকারীদের কাছে জনপ্রিয়
- tcsh: আরো সহজ-ব্যবহারের বৈশিষ্ট্য সহ csh-এর একটি সংস্করণ
- zsh: Z শেল, যা অন্যান্য জনপ্রিয় শেলগুলির অনেক বৈশিষ্ট্যকে একত্রিত করে
সমস্ত শেলের অন্তর্নির্মিত কমান্ড রয়েছে যা মূল ইউটিলিটিগুলির দ্বারা প্রদত্ত কমান্ডগুলির পরিপূরক বা প্রতিস্থাপন করে। শেলের ম্যান পৃষ্ঠাটি খুলুন এবং এটি যে কমান্ডগুলি প্রদান করে তা দেখতে "বিল্ট-ইনস" বিভাগটি খুঁজুন৷
প্রতিটি শেল এর নিজস্ব ব্যক্তিত্ব এবং বাক্য গঠন আছে। কিছু আপনার জন্য অন্যদের তুলনায় ভাল কাজ করবে. আমি সি শেল, কর্ন শেল এবং জেড শেল ব্যবহার করেছি। আমি এখনও তাদের যে কোনওটির চেয়ে ব্যাশ শেলটি বেশি পছন্দ করি। আপনার জন্য সবচেয়ে ভাল কাজ করে এমন একটি ব্যবহার করুন, যদিও এর জন্য আপনাকে অন্য কিছু চেষ্টা করার প্রয়োজন হতে পারে। ভাগ্যক্রমে, শেল পরিবর্তন করা বেশ সহজ।
এই সমস্ত শেল হল প্রোগ্রামিং ভাষা, সেইসাথে কমান্ড ইন্টারপ্রেটার। এখানে কিছু প্রোগ্রামিং নির্মাণ এবং সরঞ্জামগুলির একটি দ্রুত সফর যা ব্যাশের অবিচ্ছেদ্য অংশ৷
প্রোগ্রামিং ভাষা হিসেবে ব্যাশ
বেশিরভাগ sysadmins কমান্ড জারি করার জন্য Bash ব্যবহার করেছে যা সাধারণত মোটামুটি সহজ এবং সোজা। কিন্তু ব্যাশ একক কমান্ড প্রবেশের বাইরে যেতে পারে এবং অনেক সিস্যাডমিন একাধিক কাজ সম্পাদনের জন্য সাধারণ কমান্ড-লাইন প্রোগ্রাম তৈরি করে। এই প্রোগ্রামগুলি সাধারণ সরঞ্জাম যা সময় এবং শ্রম বাঁচাতে পারে৷
CLI প্রোগ্রাম লেখার সময় আমার উদ্দেশ্য হল সময় এবং শ্রম বাঁচানো (অর্থাৎ, অলস সিসাডমিন হওয়া)। CLI প্রোগ্রামগুলি একটি নির্দিষ্ট ক্রমানুসারে একাধিক কমান্ড তালিকাভুক্ত করে এটিকে সমর্থন করে যা একের পর এক চালায়, তাই আপনাকে একটি কমান্ডের অগ্রগতি দেখতে হবে না এবং প্রথমটি শেষ হলে পরবর্তী কমান্ডে টাইপ করতে হবে। আপনি অন্য কিছু করতে যেতে পারেন এবং প্রতিটি কমান্ডের অগ্রগতি ক্রমাগত নিরীক্ষণ করতে হবে না।
"একটি প্রোগ্রাম" কি?
ফ্রি অন-লাইন ডিকশনারি অফ কম্পিউটিং (FOLDOC) একটি প্রোগ্রামকে এইভাবে সংজ্ঞায়িত করে:"একটি কম্পিউটারের দ্বারা নির্বাহিত নির্দেশাবলী, যা তারা চালিত শারীরিক ডিভাইসের বিপরীতে।" প্রিন্সটন ইউনিভার্সিটির WordNet একটি প্রোগ্রামকে এইভাবে সংজ্ঞায়িত করে:"...নির্দেশের একটি ক্রম যা একটি কম্পিউটার ব্যাখ্যা করতে এবং কার্যকর করতে পারে..." উইকিপিডিয়াতে কম্পিউটার প্রোগ্রাম সম্পর্কে একটি ভাল এন্ট্রি রয়েছে৷
অতএব, একটি প্রোগ্রামে এক বা একাধিক নির্দেশাবলী থাকতে পারে যা একটি নির্দিষ্ট, সম্পর্কিত কাজ সম্পাদন করে। একটি কম্পিউটার প্রোগ্রাম নির্দেশনাকে একটি প্রোগ্রাম স্টেটমেন্টও বলা হয়। সিসাডমিনের জন্য, একটি প্রোগ্রাম সাধারণত শেল কমান্ডের একটি ক্রম। লিনাক্সের জন্য উপলব্ধ সমস্ত শেল, অন্তত আমি যেগুলির সাথে পরিচিত, অন্তত একটি মৌলিক ফর্মিং প্রোগ্রামিং ক্ষমতা আছে, এবং ব্যাশ, বেশিরভাগ লিনাক্স ডিস্ট্রিবিউশনের জন্য ডিফল্ট শেল, এর ব্যতিক্রম নয়৷
যদিও এই সিরিজটি ব্যাশ ব্যবহার করে (কারণ এটি সর্বব্যাপী), আপনি যদি একটি ভিন্ন শেল ব্যবহার করেন তবে সাধারণ প্রোগ্রামিং ধারণাগুলি একই হবে, যদিও গঠন এবং সিনট্যাক্স কিছুটা আলাদা হতে পারে। কিছু শেল কিছু বৈশিষ্ট্য সমর্থন করতে পারে যা অন্যরা করে না, কিন্তু তারা সব কিছু প্রোগ্রামিং ক্ষমতা প্রদান করে। শেল প্রোগ্রামগুলি বারবার ব্যবহারের জন্য একটি ফাইলে সংরক্ষণ করা যেতে পারে, অথবা প্রয়োজন অনুসারে কমান্ড লাইনে তৈরি করা যেতে পারে।
সাধারণ CLI প্রোগ্রাম
সবচেয়ে সহজ কমান্ড-লাইন প্রোগ্রামগুলি হল এক বা দুটি পরপর প্রোগ্রাম স্টেটমেন্ট, যা সম্পর্কিত বা নাও হতে পারে, যেগুলি Enter এর আগে কমান্ড লাইনে প্রবেশ করানো হয়। কী চাপা হয়। একটি প্রোগ্রামের দ্বিতীয় বিবৃতি, যদি একটি থাকে তবে তা প্রথমটির কর্মের উপর নির্ভরশীল হতে পারে, তবে এটি হওয়ার প্রয়োজন নেই৷
এছাড়াও এক বিট সিনট্যাক্টিক্যাল বিরাম চিহ্ন রয়েছে যা স্পষ্টভাবে বলা দরকার। কমান্ড লাইনে একটি একক কমান্ড প্রবেশ করার সময়, এন্টার টিপুন কী একটি অন্তর্নিহিত সেমিকোলন (;) সহ কমান্ডটি শেষ করে ) কমান্ড লাইনে একটি একক লাইন হিসাবে প্রবেশ করা একটি CLI শেল প্রোগ্রামে ব্যবহৃত হলে, সেমিকোলনটি অবশ্যই প্রতিটি বিবৃতিকে শেষ করতে এবং পরবর্তী একটি থেকে আলাদা করতে ব্যবহার করতে হবে। একটি CLI শেল প্রোগ্রামের শেষ বিবৃতিটি একটি স্পষ্ট বা অন্তর্নিহিত সেমিকোলন ব্যবহার করতে পারে৷
কিছু মৌলিক সিনট্যাক্স
নিম্নলিখিত উদাহরণগুলি এই সিনট্যাক্সটিকে স্পষ্ট করবে৷ এই প্রোগ্রামটি একটি স্পষ্ট টার্মিনেটর সহ একটি একক কমান্ড নিয়ে গঠিত:
[student@studentvm1 ~]$ echo "Hello world." ;
Hello world.
এটি একটি প্রোগ্রামের মতো মনে হতে পারে না, তবে এটিই প্রথম প্রোগ্রাম যা আমি প্রতিটি নতুন প্রোগ্রামিং ভাষার সাথে মুখোমুখি হই। সিনট্যাক্স প্রতিটি ভাষার জন্য একটু ভিন্ন হতে পারে, কিন্তু ফলাফল একই।
আসুন এই তুচ্ছ কিন্তু সর্বব্যাপী প্রোগ্রামে একটু প্রসারিত করা যাক। আপনার ফলাফলগুলি আমার থেকে আলাদা হবে কারণ আমি অন্যান্য পরীক্ষা-নিরীক্ষা করেছি, যখন আপনার কাছে শুধুমাত্র ডিফল্ট ডিরেক্টরি এবং ফাইল থাকতে পারে যা অ্যাকাউন্ট হোম ডিরেক্টরিতে তৈরি করা হয় যখন আপনি প্রথমবার GUI ডেস্কটপের মাধ্যমে একটি অ্যাকাউন্টে লগ ইন করেন।
[student@studentvm1 ~]$ echo "My home directory." ; ls ;
My home directory.
chapter25 TestFile1.Linux dmesg2.txt Downloads newfile.txt softlink1 testdir6
chapter26 TestFile1.mac dmesg3.txt file005 Pictures Templates testdir
TestFile1 Desktop dmesg.txt link3 Public testdir Videos
TestFile1.dos dmesg1.txt Documents Music random.txt testdir1
যে একটি বিট আরো জ্ঞান করে তোলে. ফলাফল সম্পর্কিত, কিন্তু পৃথক প্রোগ্রাম বিবৃতি একে অপরের থেকে স্বাধীন। লক্ষ্য করুন যে আমি সেমিকোলনের আগে এবং পরে স্পেস রাখতে পছন্দ করি কারণ এটি কোডটিকে পড়তে কিছুটা সহজ করে তোলে। শেষে একটি স্পষ্ট সেমিকোলন ছাড়াই সেই ছোট্ট CLI প্রোগ্রামটি আবার চেষ্টা করুন:
[student@studentvm1 ~]$ echo "My home directory." ; ls
আউটপুটে কোন পার্থক্য নেই।
ভেরিয়েবল সম্পর্কে কিছু
সমস্ত প্রোগ্রামিং ভাষার মতো, ব্যাশ শেল ভেরিয়েবলের সাথে মোকাবিলা করতে পারে। একটি ভেরিয়েবল হল একটি প্রতীকী নাম যা মেমরির একটি নির্দিষ্ট অবস্থানকে বোঝায় যা কিছু ধরণের মান ধারণ করে। একটি ভেরিয়েবলের মান পরিবর্তনযোগ্য, অর্থাৎ, এটি পরিবর্তনশীল।
Bash C এবং সম্পর্কিত ভাষার মত ভেরিয়েবল টাইপ করে না, সেগুলিকে পূর্ণসংখ্যা, ফ্লোটিং পয়েন্ট বা স্ট্রিং টাইপ হিসাবে সংজ্ঞায়িত করে। Bash-এ, সমস্ত ভেরিয়েবল হল স্ট্রিং। পূর্ণসংখ্যার একটি স্ট্রিং পূর্ণসংখ্যার পাটিগণিতের মধ্যে ব্যবহার করা যেতে পারে, যেটি একমাত্র গণিতের ধরন যা ব্যাশ করতে সক্ষম। আরও জটিল গণিতের প্রয়োজন হলে, bc CLI প্রোগ্রাম এবং স্ক্রিপ্টে কমান্ড ব্যবহার করা যেতে পারে।
ভেরিয়েবলগুলি নির্ধারিত মান এবং CLI প্রোগ্রাম এবং স্ক্রিপ্টগুলিতে সেই মানগুলি উল্লেখ করতে ব্যবহার করা যেতে পারে। একটি ভেরিয়েবলের মান তার নাম ব্যবহার করে সেট করা হয় কিন্তু একটি $ এর আগে নয় চিহ্ন. অ্যাসাইনমেন্ট VAR=10 ভেরিয়েবল VAR এর মান 10 এ সেট করে। ভেরিয়েবলের মান প্রিন্ট করতে, আপনি echo $VAR স্টেটমেন্ট ব্যবহার করতে পারেন। . টেক্সট দিয়ে শুরু করুন (যেমন, অ-সংখ্যাসূচক) ভেরিয়েবল।
ব্যাশ ভেরিয়েবলগুলি শেল পরিবেশের অংশ হয়ে যায় যতক্ষণ না সেগুলি সেট না করা হয়৷
একটি ভেরিয়েবলের প্রাথমিক মান পরীক্ষা করুন যা বরাদ্দ করা হয়নি; এটা শূন্য হওয়া উচিত। তারপর ভেরিয়েবলের একটি মান বরাদ্দ করুন এবং এর মান যাচাই করতে এটি প্রিন্ট করুন। আপনি একটি একক CLI প্রোগ্রামে এই সব করতে পারেন:
[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;
Hello World
[student@studentvm1 ~]$
দ্রষ্টব্য:পরিবর্তনশীল অ্যাসাইনমেন্টের সিনট্যাক্স খুবই কঠোর। সমান (=) এর উভয় পাশে অবশ্যই কোনো স্পেস থাকবে না ) অ্যাসাইনমেন্ট স্টেটমেন্টে সাইন ইন করুন।
খালি লাইনটি নির্দেশ করে যে MyVar এর প্রাথমিক মান শূন্য। একটি ভেরিয়েবলের মান পরিবর্তন এবং সেট করা একইভাবে করা হয়। এই উদাহরণটি আসল এবং নতুন মান উভয়ই দেখায়।
উল্লিখিত হিসাবে, Bash পূর্ণসংখ্যার গাণিতিক গণনা করতে পারে, যা একটি অ্যারেতে একটি উপাদানের অবস্থানের একটি রেফারেন্স গণনা করতে বা সাধারণ গণিত সমস্যাগুলি করার জন্য দরকারী। এটি বৈজ্ঞানিক কম্পিউটিং বা এমন কিছুর জন্য উপযুক্ত নয় যার জন্য দশমিক প্রয়োজন, যেমন আর্থিক গণনা। এই ধরণের গণনার জন্য আরও ভাল সরঞ্জাম রয়েছে।
এখানে একটি সহজ হিসাব:
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
Result = 63
আপনি যখন একটি গণিত অপারেশন করেন যার ফলে একটি ফ্লোটিং-পয়েন্ট সংখ্যা হয় তখন কী হয়?
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"
Result = 0
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"
Result = 1
[student@studentvm1 ~]$
ফলাফল হল নিকটতম পূর্ণসংখ্যা। লক্ষ্য করুন যে গণনাটি প্রতিধ্বনি এর অংশ হিসাবে সম্পাদিত হয়েছিল বিবৃতি প্রাধান্যের ব্যাশ ক্রমের কারণে এনক্লোসিং ইকো কমান্ডের আগে গণিত করা হয়। বিস্তারিত জানার জন্য ব্যাশ ম্যান পৃষ্ঠাটি দেখুন এবং "অগ্রাধিকার" অনুসন্ধান করুন।
নিয়ন্ত্রণ অপারেটর
শেল কন্ট্রোল অপারেটররা সহজে কিছু আকর্ষণীয় কমান্ড-লাইন প্রোগ্রাম তৈরি করার জন্য সিনট্যাক্টিক্যাল অপারেটরগুলির মধ্যে একটি। CLI প্রোগ্রামের সহজতম রূপ হল কমান্ড লাইনে একটি ক্রমানুসারে কয়েকটি কমান্ড একসাথে স্ট্রিং করা:
command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;
এই কমান্ডগুলি সমস্ত সমস্যা ছাড়াই চলে যতক্ষণ না কোনও ত্রুটি না ঘটে। কিন্তু কোন ত্রুটি ঘটলে কি হবে? আপনি বিল্ট-ইন && ব্যবহার করে ত্রুটিগুলি অনুমান করতে এবং অনুমতি দিতে পারেন৷ এবং || ব্যাশ নিয়ন্ত্রণ অপারেটর. এই দুটি নিয়ন্ত্রণ অপারেটর কিছু প্রবাহ নিয়ন্ত্রণ প্রদান করে এবং আপনাকে কোড সম্পাদনের ক্রম পরিবর্তন করতে সক্ষম করে। সেমিকোলনটিকেও একটি ব্যাশ কন্ট্রোল অপারেটর হিসাবে বিবেচনা করা হয়, যেমন নিউলাইন অক্ষর।
&& অপারেটর সহজভাবে বলে, "যদি কমান্ড1 সফল হয়, তাহলে কমান্ড2 চালান। কমান্ড1 কোনো কারণে ব্যর্থ হলে, কমান্ড2 এড়িয়ে যাবে।" এই সিনট্যাক্স এই মত দেখায়:
command1 && command2
এখন, কিছু কমান্ড দেখুন যা একটি নতুন ডিরেক্টরি তৈরি করবে এবং - যদি এটি সফল হয় - এটিকে বর্তমান ওয়ার্কিং ডিরেক্টরি (PWD) করুন। নিশ্চিত করুন যে আপনার হোম ডিরেক্টরি (~ ) হল PWD. এটি প্রথমে /root-এ চেষ্টা করুন , একটি ডিরেক্টরি যেখানে আপনার অ্যাক্সেস নেই:
[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dir
mkdir: cannot create directory '/root/testdir/': Permission denied
[student@studentvm1 ~]$
ত্রুটিটি mkdir দ্বারা নির্গত হয়েছে৷ আদেশ আপনি একটি ত্রুটি পাননি যে নির্দেশ করে যে ফাইলটি তৈরি করা যায়নি কারণ ডিরেক্টরি তৈরি করা ব্যর্থ হয়েছে৷ && নিয়ন্ত্রণ অপারেটর অ-শূন্য রিটার্ন কোড অনুধাবন করেছে, তাই টাচ কমান্ড এড়িয়ে গেছে। && ব্যবহার করে কন্ট্রোল অপারেটর স্পর্শকে বাধা দেয় নির্দেশিকা তৈরি করার সময় একটি ত্রুটি ছিল কারণ রান থেকে কমান্ড. এই ধরনের কমান্ড-লাইন প্রোগ্রাম ফ্লো কন্ট্রোল কম্পাউন্ডিং এবং জিনিসগুলির একটি বাস্তব জগাখিচুড়ি করা থেকে ত্রুটিগুলি প্রতিরোধ করতে পারে। কিন্তু এটা একটু বেশি জটিল হওয়ার সময়।
|| কন্ট্রোল অপারেটর আপনাকে অন্য একটি প্রোগ্রাম স্টেটমেন্ট যোগ করার অনুমতি দেয় যা কার্যকর হয় যখন প্রাথমিক প্রোগ্রাম স্টেটমেন্ট শূন্যের চেয়ে বড় কোড ফেরত দেয়। মৌলিক সিনট্যাক্স এই মত দেখায়:
command1 || command2
এই সিনট্যাক্সটি পড়ে, "যদি কমান্ড1 ব্যর্থ হয়, কমান্ড 2 চালান।" এটি বোঝায় যে কমান্ড1 সফল হলে, কমান্ড 2 এড়িয়ে যাবে। একটি নতুন ডিরেক্টরি তৈরি করার চেষ্টা করে এটি চেষ্টা করুন:
[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$
এই আপনি কি আশা করবে ঠিক কি. কারণ নতুন ডিরেক্টরি তৈরি করা যায়নি, প্রথম কমান্ড ব্যর্থ হয়েছে, যার ফলে দ্বিতীয় কমান্ডটি কার্যকর হয়েছে।
এই দুটি অপারেটর একত্রিত করা উভয়ের সেরা প্রদান করে। কিছু প্রবাহ নিয়ন্ত্রণ ব্যবহার করে কন্ট্রোল অপারেটর সিনট্যাক্স এই সাধারণ ফর্মটি নেয় যখন && এবং || নিয়ন্ত্রণ অপারেটর ব্যবহার করা হয়:
preceding commands ; command1 && command2 || command3 ; following commands
এই সিনট্যাক্সটিকে এভাবে বলা যেতে পারে:"যদি কমান্ড1 0 এর রিটার্ন কোড দিয়ে প্রস্থান করে, তাহলে কমান্ড2 চালান, অন্যথায় কমান্ড 3 চালান।" চেষ্টা করে দেখুন:
[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$
এখন /root এর পরিবর্তে আপনার হোম ডিরেক্টরি ব্যবহার করে শেষ কমান্ডটি আবার চেষ্টা করুন ডিরেক্টরি আপনার এই ডিরেক্টরি তৈরি করার অনুমতি থাকবে:
[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
[student@studentvm1 testdir]$
নিয়ন্ত্রণ অপারেটর সিনট্যাক্স, যেমন command1 &&command2 , কাজ করে কারণ প্রতিটি কমান্ড শেলটিতে একটি রিটার্ন কোড (RC) পাঠায় যা নির্দেশ করে যে এটি সফলভাবে সম্পন্ন হয়েছে কিনা বা কার্যকর করার সময় কোনো ধরনের ব্যর্থতা ছিল কিনা। নিয়ম অনুসারে, শূন্য (0) এর একটি RC সাফল্য নির্দেশ করে, এবং যে কোনও ধনাত্মক সংখ্যা কিছু ধরণের ব্যর্থতা নির্দেশ করে। কিছু টুল সিস্যাডমিনরা ব্যবহার করে শুধুমাত্র একটি (1) একটি ব্যর্থতা নির্দেশ করার জন্য, কিন্তু অনেকে অন্য কোড ব্যবহার করে ব্যর্থতার ধরন নির্দেশ করতে।
ব্যাশ শেল ভেরিয়েবল $? শেষ কমান্ড থেকে RC ধারণ করে। এই RC একটি স্ক্রিপ্ট, কমান্ডের তালিকার পরবর্তী কমান্ড, এমনকি সরাসরি sysadmin দ্বারা খুব সহজে চেক করা যেতে পারে। একটি সাধারণ কমান্ড চালানোর মাধ্যমে শুরু করুন এবং অবিলম্বে RC চেক করুন। RC সর্বদা শেষ কমান্ডের জন্য থাকবে যা আপনি এটি দেখার আগে চলেছিল।
[student@studentvm1 testdir]$ ll ; echo "RC = $?"
total 1264
drwxrwxr-x 2 student student 4096 Mar 2 08:21 chapter25
drwxrwxr-x 2 student student 4096 Mar 21 15:27 chapter26
-rwxr-xr-x 1 student student 92 Mar 20 15:53 TestFile1
<snip>
drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdir
drwxr-xr-x. 2 student student 4096 Dec 22 13:15 Videos
RC = 0
[student@studentvm1 testdir]$
আরসি, এই ক্ষেত্রে, শূন্য, যার মানে কমান্ডটি সফলভাবে সম্পন্ন হয়েছে। এখন রুটের হোম ডিরেক্টরিতে একই কমান্ড ব্যবহার করে দেখুন, এমন একটি ডিরেক্টরি যার জন্য আপনার অনুমতি নেই:
[student@studentvm1 testdir]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 testdir]$
এই ক্ষেত্রে, আরসি দুটি; এর অর্থ হল একটি অ-রুট ব্যবহারকারীর জন্য একটি ডিরেক্টরি অ্যাক্সেস করার অনুমতি অস্বীকার করা হয়েছে যেখানে ব্যবহারকারীর অ্যাক্সেস অনুমোদিত নয়। কন্ট্রোল অপারেটররা এই RC ব্যবহার করে আপনাকে প্রোগ্রাম এক্সিকিউশনের ক্রম পরিবর্তন করতে সক্ষম করে।
সারাংশ
এই নিবন্ধটি ব্যাশকে একটি প্রোগ্রামিং ভাষা হিসাবে দেখেছে এবং এর মৌলিক সিনট্যাক্সের পাশাপাশি কিছু মৌলিক সরঞ্জামগুলি অন্বেষণ করেছে। এটি দেখিয়েছে কিভাবে STDOUT-এ ডেটা প্রিন্ট করতে হয় এবং কীভাবে ভেরিয়েবল এবং নিয়ন্ত্রণ অপারেটর ব্যবহার করতে হয়। এই সিরিজের পরবর্তী নিবন্ধটি অনেকগুলি ব্যাশ লজিক্যাল অপারেটরগুলির মধ্যে কিছু দেখায় যা নির্দেশনা কার্যকর করার প্রবাহ নিয়ন্ত্রণ করে৷