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

ব্যাশ স্ক্রিপ্ট অপ্টিমাইজ করার ৫টি প্রমাণিত কৌশল: নির্ভরযোগ্যতা ও দক্ষতার জন্য

এক সিস্টেম অ্যাডমিন প্রায়শই ব্যাশ স্ক্রিপ্ট লিখে, কিছু ছোট কিছু বড়, বিভিন্ন টাস্ক সম্পন্ন করার জন্য।

আপনি কি কোনো সফটওয়্যার ভেন্ডরদ্বারা প্রদত্ত ইনস্টলেশন স্ক্রিপ্টে তাকিয়ে থাকেছেন? তারা ঘন ঘন অনেক ফাংশন এবং লজিক যোগ করে যেন ইনস্টলেশন সঠিকভাবে কাজ করে এবং কাস্টমারের সিস্টেমে কোনো ক্ষতি না হয়। বছরের পর বছর, আমি আমার ব্যাশ স্ক্রিপ্টগুলোর উন্নতির জন্য বিভিন্ন কৌশল সংগ্রহ করেছি, এবং আমি আশা করি সেগুলো শেয়ার করলে অন্যদের সাহায্য হবে। এখানে এই সহজ উদাহরণগুলোর ইলাস্ট্রেট করার জন্য তৈরি করা ছোট ছোট স্ক্রিপ্টের একটি সংগ্রহ দেওয়া হলো।

শুরু

যখন আমি শুরু করেছিলাম, আমার ব্যাশ স্ক্রিপ্টগুলো কেবল কমান্ডের একটি সিরিজ, সাধারণত স্ট্যান্ডার্ড শেল অপারেশন যেমন ওয়েব কন্টেন্ট ডিপ্লয় করার মতো কাজে সময় বাঁচাতে। একটা টাস্ক ছিল একটি Apache ওয়েব সার্ভারের হোম ডিরেক্টরিতে স্ট্যাটিক কন্টেন্ট এক্সট্রাক্ট করা। আমার স্ক্রিপ্টটি এরকম ছিল:

cp january_schedule.tar.gz /usr/apache/home/calendar/
cd /usr/apache/home/calendar/
tar zvxf january_schedule.tar.gz

এটি আমার কিছু সময় এবং টাইপিং বাঁচিয়েছিল, কিন্তু দীর্ঘমেয়াদে এটি কোনো রকম আকর্ষণীয় বা উপকারী স্ক্রিপ্ট ছিল না। সময়ের সাথে সাথে, আমি ব্যাশ স্ক্রিপ্ট ব্যবহার করে আরও চ্যালেঞ্জিং টাস্ক সম্পন্ন করার অন্যান্য উপায় শিখলাম, যেমন সফটওয়্যার প্যাকেজ তৈরি করা, সফটওয়্যার ইনস্টল করা, বা একটি ফাইল সার্ভার ব্যাকআপ করা।

১. কন্ডিশনাল স্টেটমেন্ট

অনেক অন্যান্য প্রোগ্রামিং ভাষার মতো, কন্ডিশনাল একটি শক্তিশালী এবং সাধারণ ফিচার। আমার অধিকাংশ উদাহরণ কন্ডিশনাল লজিকের ওপর ভিত্তি করে।

বেসিক কন্ডিশনাল একটি "if" স্টেটমেন্ট ব্যবহার করে। এটি আমাদের কিছু শর্ত পরীক্ষা করতে দেয় যা আমরা পরে ব্যবহার করতে পারি স্ক্রিপ্টটি কীভাবে পারফর্ম করবে সেটি ম্যানিপুলেট করার জন্য। উদাহরণস্বরূপ, আমরা একটি Java বিন ডিরেক্টরির অস্তিত্ব চেক করতে পারি, যা ইঙ্গিত দেবে যে Java ইনস্টলড। যদি পাওয়া যায়, এক্সিকিউটেবল পাথটি লোকেশন দিয়ে আপডেট করা যায় যাতে Java অ্যাপ্লিকেশন কল করতে পারে।

if [ -d "$JAVA_HOME/bin" ] ; then
PATH="$JAVA_HOME/bin:$PATH"

২. এক্সিকিউশন সীমাবদ্ধ করুন

আপনি চাইতে পারেন একটি স্ক্রিপ্ট শুধু একজন নির্দিষ্ট ইউজার দ্বারা রান হোক। যদিও লিনাক্সের যوزার এবং গ্রুপের জন্য স্ট্যান্ডার্ড পারমিশন আছে, এবং এই ধরনের প্রোটেকশনের জন্য SELinux আছে, আপনি স্ক্রিপ্টের ভেতরে লজিক রাখতে পারেন। হয়তো আপনি নিশ্চিত করতে চান যে একটি নির্দিষ্ট ওয়েব অ্যাপ্লিকেশনের মালিক সেটির স্টার্টআপ স্ক্রিপ্ট রান করতে পারে। আপনি কোডও ব্যবহার করতে পারেন স্ক্রিপ্টকে রুট ইউজার til সীমাবদ্ধ করতে। লিনাক্সের কয়েকটি এনভায়রনমেন্ট ভেরিয়েবল আছে যা আমরা এই লজিকে টেস্ট করতে পারি। একটি হল $USER, যা ইউজারনেম দেয়। আরেকটি হল $UID, যা ইউজারের আইডেন্টিফিকেশন নম্বর (UID) দেয় এবং একটি স্ক্রিপ্টের ক্ষেত্রে, এক্সিকিউটিং ইউজারের UID।

ইউজার

প্রথম উদাহরণে দেখানো হয়েছে কীভাবে আমি একটি স্ক্রিপ্টকে একটি মাল্টি-হোস্টিং এনভায়রনমেন্টে অনেক অ্যাপ্লিকেশন সার্ভার ইনস্ট্যান্স সহ jboss1 ইউজার til সীমাবদ্ধ করতে পারি। কন্ডিশনাল "if" স্টেটমেন্ট মূলত জিজ্ঞাসা করে, "এক্সিকিউটিং ইউজার কি jboss1 নয়?" যখন শর্তটি সত্য পাওয়া যায়, প্রথম echo স্টেটমেন্ট কল হয়, এরপর exit 1, যা স্ক্রিপ্টটি টার্মিনেট করে।

if [ "$USER" != 'jboss1' ]; then
echo "Sorry, this script must be run as JBOSS1!"
exit 1
fi
echo "continue script"

রুট

এই পরবর্তী উদাহরণ স্ক্রিপ্ট নিশ্চিত করে যে শুধু রুট ইউজার এটি এক্সিকিউট করতে পারে। কারণ রুটের UID হল ০, আমরা কন্ডিশনাল if স্টেটমেন্টে -gt অপশন ব্যবহার করতে পারি শূন্য চেয়ে বড় সকল UID নিষিদ্ধ করতে।

if [ "$UID" -gt 0 ]; then
echo "Sorry, this script must be run as ROOT!"
exit 1
fi
echo "continue script"

৩. আর্গুমেন্ট ব্যবহার করুন

যেকোনো এক্সিকিউটেবল প্রোগ্রামের মতো, ব্যাশ স্ক্রিপ্ট আর্গুমেন্ট ইনপুট হিসেবে নিতে পারে। নিচে কয়েকটি উদাহরণ। কিন্তু প্রথমে, আপনাকে বুঝতে হবে ভালো প্রোগ্রামিং মানে আমরা শুধু সেই অ্যাপ্লিকেশন লিখি না যা আমরা চাই; আমাদের সেই অ্যাপ্লিকেশন লিখতে হবে যা আমরা না চাই সেটি না করতে পারে। আমি পছন্দ করি নিশ্চিত করা যে কোনো আর্গুমেন্ট ন रहने کیসে স্ক্রিপ্ট কিছু ডס্ট্রাক্টিভ করে না। তাই এটি প্রথম চেক। কন্ডিশন আর্গুমেন্টের সংখ্যা, $#, শূন্য হলে চেক করে এবং সত্য হলে স্ক্রিপ্ট টার্মিনেট করে।

if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
echo "arguments found: $#"

একাধিক আর্গুমেন্ট

আপনি একটি স্ক্রিপ্টে একাধিক আর্গুমেন্ট পাস করতে পারেন। স্ক্রিপ্ট যা ইন্টারন্যাল ভেরিয়েবল ব্যবহার করে প্রতিটি আর্গুমেন্ট রেফার করতে, সেগুলো সিম্পলি ইনক্রিমেন্টেড, যেন $1, $2, $3, ইত্যাদি। আমি শুধু উপরের উদাহরণটি নিচের লাইন দিয়ে এক্সপ্যান্ড করব প্রথম তিনটি আর্গুমেন্ট ইচো করার জন্য। অবশ্যই, টোটাল নম্বর বেসড করে প্রপার আর্গুমেন্ট হ্যান্ডলিং-এর জন্য অতিরিক্ত লজিক দরকার। এই উদাহরণটি ডেমোstrationsের জন্য সহজ রাখা হয়েছে।

echo $1 $2 $3

যখন আমরা এই আর্গুমেন্ট ভেরিয়েবলগুলো নিয়ে আলোচনা করছি, আপনি হয়তো চিন্তা করেছেন, "তিনি কি জিরো স্কিপ করলেন?"

হ্যাঁ, আমি করলাম, কিন্তু আমার একটি দুর্দান্ত কারণ আছে! একটি $0 ভেরিয়েবল অবশ্যই আছে, এবং এটি খুব উপকারী। এর ভ্যালু শুধু এক্সিকিউট হওয়া স্ক্রিপ্টের নাম।

echo $0

এক্সিকিউশনের সময় স্ক্রিপ্টের নাম রেফারেন্স করার একটি গুরুত্বপূর্ণ কারণ হল একটি লগ ফাইল জেনারেট করা যেটি তার নিজস্ব নেমে স্ক্রিপ্টের নাম অন্তর্ভুক্ত করে। সিম্পলেস্ট ফর্ম হয়তো শুধু একটি echo স্টেটমেন্ট।

echo test >> $0.log

তবে, আপনি হয়তো আরও কিছু কোড যোগ করতে চান যেন লগটি একটি লোকেশনে লেখা হয় যেটি আপনার ইউজ কেসের জন্য সহায়ক নাম এবং ইনফরমেশন সহ।

৪. ইউজার ইনপুট

এক স্ক্রিপ্টে ব্যবহার করার জন্য আরেকটি উপকারী ফিচার হল এক্সিকিউশনের সময় ইনপুট গ্রহণ করার ক্ষমতা। সিম্পলেস্ট হল ইউজারকে কিছু ইনপুট অফার করা।

echo "enter a word please:"
read word
echo $word

এটিও আপনাকে ইউজারকে চয়েস দিতে দেয়।

read -p "Install Software ?? [Y/n]: " answ
if [ "$answ" == 'n' ]; then
exit 1
fi
echo "Installation starting..."

৫. ফেইলালে এক্সিট করুন

কয়েক বছর আগে, আমি একটি স্ক্রিপ্ট লিখেছিলাম আমার কম্পিউটারে লেটেস্ট ভার্সনের Java Development Kit (JDK) ইনস্টল করার জন্য। স্ক্রিপ্টটি JDK আর্কাইভটি একটি নির্দিষ্ট ডিরেক্টরিতে এক্সট্রাক্ট করত, একটি সিম্বোলিক লিংক আপডেট করত, এবং সিস্টেমকে নতুন ভার্সন সম্পর্কে অবগত করাতে alternatives ইউটিলিটি ব্যবহার করত। যদি JDK আর্কাইভ এক্সট্রাক্ট ফেইল করত, কন্টিনিউ করলে Java সিস্টেম-ওয়াইড ব্রেক করতে পারত। তাই, আমি চেয়েছিলাম স্ক্রিপ্টটি সেক্ষনের মত পরিস্থিতিতে অবোর্ট করুক। আমি চাইনা স্ক্রিপ্টটি পরবর্তী সিস্টেম পরিবর্তনগুলো করুক যদি আর্কাইভ সফলভাবে এক্সট্রাক্ট না হয়। সেই স্ক্রিপ্টটির একটি এক্সসার্প্ট:

tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$?
if [ $ec -ne 0 ]; then
echo "Installation failed - exiting."
exit 1
fi

$? ভেরিয়েবল ব্যবহারের জন্য একটি দ্রুত ডেমো এই শর্ট ওয়ান-লাইনারের সাথে:

ls T; ec=$?; echo $ec

প্রথমে, touch T রান করুন এরপর এই কমান্ড। ec-এর ভ্যালু ০ হবে। তারপর, T ডিলিট করুন, rm T, এবং কমান্ডটি রিপিট করুন। ec-এর ভ্যালু এখন ২ হবে কারণ ls এরর কন্ডিশন রিপোর্ট করে যেহেতু T পাওয়া যায়নি।

আপনি এই এরর রিপোর্টিংয়ের সুবিধা নিতে পারেন লজিক অন্তর্ভুক্ত করে, যেমন আমি উপরে করেছি, আপনার স্ক্রিপ্টের আচরণ কন্ট্রোল করার জন্য।

নिष्कর্ষ

আমরা ধরে নিতে পারি আমাদের Python, C, বা Java-এর মতো ভাষা প্রয়োজন উন্নত ফাংশনালিটির জন্য, কিন্তু সেটি অবশ্যই সত্য নয়। ব্যাশ স্ক্রিপ্টিং ভাষা খুব শক্তিশালী। এর উপযোগিতা সর্বোচ্চ করার জন্য শিখতে অনেক কিছু আছে। আশা করি এই কয়েকটি উদাহরণ ব্যাশ দিয়ে কোডিংয়ের পোটেনশিয়ালে কিছু আলোকপাত করবে।

  1. টাইপিং স্পিড বাড়ানোর ৫টি কার্যকর উপায়

  2. Bash-এ ফাইল পড়া মাস্টার করুন: সেরা While-Loop টেকনিকসমূহ

  3. Bash-it: স্ক্রিপ্ট, এলিয়াস ও কাস্টম ফাংশন পরিচালনার 궁극ের বাশ ফ্রেমওয়ার্ক

  4. মাস্টার বাশ স্ক্রিপ্টিং: বিশ্বস্ত লিনাক্স অটোমেশনের জন্য ১০ অপরিহার্য টিপস