সাম্প্রতিক একটি শেল স্ক্রিপ্টে কাজ করার সময় আমি bash স্পেশাল ভেরিয়েবল $$ এবং $BASHPID-র আচরণে উল্লেখযোগ্য পার্থক্য দেখলাম। লিনাক্সে চলমান প্রতিটি প্রসেস একটি প্রসেস ID-র সাথে অ্যাসাইন করা থাকে এবং সেটিই অপারেটিং সিস্টেম প্রসেস হ্যান্ডেল করে।
Related Read: Learn Difference Between Sourcing and Forking in Bash
একইভাবে, আপনার bash টার্মিনাল সেশনও একটি প্রসেস ID-র সাথে অ্যাসাইন করা থাকে। একটি স্পেশাল ভেরিয়েবল আছে $$ এবং $BASHPID যা করেন্ট শেলের প্রসেস ID স্টোর করে।
নিচের কমান্ড চালিয়ে আপনার করেন্ট শেলের প্রসেস ID দেখুন। $$ এবং $BASHPID দুটোই একই ভ্যালু রিটার্ন করবে।
$ echo $$ # Printing special variable $$ $ echo $BASHPID # Printing the variable $BASHPID
Bash-এ যখন আমরা শেল থেকে যেকোনো এক্সটার্নাল প্রোগ্রাম কল করি, এটি একটি চাইল্ড প্রসেস/সাবশেল তৈরি করে এবং প্রোগ্রামটি শুধু চাইল্ড প্রসেসে সাবমিট হয়। নিচের উদাহরণ দেখুন যেখানে আমি একটি সিম্পল প্রসেস মনিটর কমান্ড একটি স্ক্রিপ্টে রেখেছি “sample.sh” নামে যাতে বুঝা যায় প্যারেন্ট শেল কীভাবে সাবশেল তৈরি করে প্রোগ্রাম রান করতে।
#!/usr/bin/env bash ps -ef --forest | grep -i bash
এখন এই স্ক্রিপ্ট রান করলে bash-এর প্রসেস ID পাওয়া যাবে। নিচের ইমেজ থেকে বুঝতে পারবেন যখন আমি স্ক্রিপ্ট কল করলাম bash একটি চাইল্ড প্রসেস তৈরি করল এবং স্ক্রিপ্ট রান করল।
$ ./sample.sh
এখন স্ক্রিপ্টের ভিতরে $$ এবং $BASHPID উভয় ব্যবহার করি এবং দেখি কী রিটার্ন করে।
#!/usr/bin/env bash echo "============================" ps -ef --forest | grep -i bash echo "============================" echo "PID USING $$ FOR SCRIPT $0 ==> $$" echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID" echo
আবার স্ক্রিপ্ট রান করুন।
$ ./sample.sh
ঠিক আছে, এটি একই প্রসেস ID রিটার্ন করল। এখানেই আসলে পার্থক্য আসে। স্ক্রিপ্টের ভিতরেই আরেকটি চাইল্ড প্রসেস তৈরি করি প্যারেনথেসিস () দিয়ে কমান্ড রান করে।
# STORING THE PID INTO A VARIABLE… VAR_HASH=$(echo $$) VAR_BASHPID=$(echo $BASHPID) echo "VALUE OF VAR_HASH ==> $VAR_HASH" echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"
Bash-এ, Parentheses একটি চাইল্ড প্রসেস ইনভোক করে এবং প্যারেনথেসিসের ভিতরের যা কিছু থাকে সেটি রান করে। সেক্ষেত্রে $$ এবং $BASHPID উভয়নিই নতুন চাইল্ড প্রসেস ID স্টোর করা উচিত। কিন্তু উপরের ইমেজ থেকে পার্থক্য দেখতে পাচ্ছেন যেখানে $$ স্টোর করেছে 382 যা প্যারেন্ট ID (স্ক্রিপ্ট sample.sh-এর প্রসেস ID), আর $BASHPID প্যারেনথেসিস দ্বারা তৈরি চাইল্ড প্রসেস ID স্টোর করেছে।
এখন এই আচরণ বুঝতে চেষ্টা করি। ম্যান পেজ কী বলে সেটি দেখি।
$ man bash
$$ ব্যবহার করলে, সাবশেলের ভিতরেও, এটি প্যারেন্ট প্রসেসের প্রসেস ID স্টোর করে যেটি থেকে এটি তৈরি হয়েছে। কিন্তু BASHPID করেন্ট প্রসেস ID স্টোর করে, অর্থাৎ প্যারেনথেসিসের ভিতরে কল করলে এটি চাইল্ড প্রসেস ID স্টোর করে।
আমরা ভেরিয়েবল $$ অ্যাসাইন বা মডিফাই করতে পারি না, কিন্তু BASHPID রি-অ্যাসাইন করা যায় যদিও এর কোনো ইফেক্ট নেই।
$ $$=10 $ BASHPID=10 $ echo $BASHPID
BASHPID আনসেট করা সম্ভব। আপনি আনসেট করলে এর স্পেশাল স্টেট হারিয়ে যায় এবং আপনি এটি নরমাল ভেরিয়েবল হিসেবে ব্যবহার করতে পারবেন।
$ unset BASHPID $ echo $BASHPID $ BASHPID="Tecmint" $ echo $BASHPID
এমনকি আপনি শেলের প্রসেস ID অ্যাসাইন করার চেষ্টা করলে এটি ইউজার-ডিফাইনড ভেরিয়েবল হিসেবে ট്രീট হবে কারণ এর স্পেশাল স্টেট হারিয়ে গেছে।
$ BASHPID=$(echo $$) $ echo $$;echo $BASHPID
এই কেসে, BASHPID-র স্পেশাল স্টেট ফেরত পেতে আপনাকে নতুন টার্মিনাল সেশন শুরু করতে হবে।
এই আর্টিকেলের জন্য এতটুকু। আমরা $$ এবং BASHPID-র পার্থক্য এবং কীভাবে সেগুলো behave করে সেটি এই আর্টিকেলে দেখেছি। আর্টিকেলটি পড়ুন এবং আপনার মূল্যবান ফিডব্যাক শেয়ার করুন।