সম্প্রতি আমি একটি শেল স্ক্রিপ্টে কাজ করছিলাম এবং আমি কিভাবে bash স্পেশাল ভেরিয়েবল $ এর একটি উল্লেখযোগ্য পার্থক্য দেখেছি এবং BASHPID আচরণ করে লিনাক্সে চলমান প্রতিটি প্রক্রিয়া একটি প্রক্রিয়া আইডি দিয়ে বরাদ্দ করা হবে এবং এভাবেই অপারেটিং সিস্টেম প্রক্রিয়াটি পরিচালনা করে।
একইভাবে, আপনার ব্যাশ টার্মিনাল সেশনও একটি প্রসেস আইডি দিয়ে বরাদ্দ করা হবে। "$" নামে একটি বিশেষ ভেরিয়েবল আছে এবং "$BASHPID" যা বর্তমান শেলের প্রসেস আইডি সংরক্ষণ করে।
এগিয়ে যান এবং আপনার বর্তমান শেলের প্রসেস আইডি কী তা দেখতে নীচের কমান্ডটি চালান। উভয়ই "$" এবং "$BASHPID" একই মান ফেরত দিতে যাচ্ছে।
$ echo $$ # প্রিন্টিং স্পেশাল ভেরিয়েবল $$ echo $BASHPID # ভ্যারিয়েবল প্রিন্ট করা হচ্ছে $BASHPID
বাশ-এ যখন আমরা শেল থেকে কোনো বহিরাগত প্রোগ্রাম কল করি, তখন এটি একটি চাইল্ড প্রসেস/সাবশেল তৈরি করবে এবং প্রোগ্রামটি শুধুমাত্র চাইল্ড প্রসেসে জমা দেওয়া হবে। নিচের উদাহরণ দেখুন যেখানে আমি “sample.sh” নামে একটি স্ক্রিপ্টে একটি সাধারণ প্রসেস মনিটর কমান্ড দিয়েছি প্রোগ্রাম চালানোর জন্য প্যারেন্ট শেল কীভাবে একটি সাবশেল তৈরি করে তা প্রদর্শন করতে।
#!/usr/bin/env bashps -ef --forest | grep -i bash
এখন এই স্ক্রিপ্টটি চালানোর সময় আমরা bash এর প্রসেস আইডি পেতে পারি। নীচের চিত্র থেকে, আপনি বুঝতে পারবেন যখন আমি স্ক্রিপ্ট ব্যাশ কল করি তখন একটি শিশু প্রক্রিয়া তৈরি করে এবং স্ক্রিপ্টটি চালায়৷
$ ./sample.sh

এখন "$" উভয়ই ব্যবহার করা যাক এবং "$BASHPID" স্ক্রিপ্টের ভিতরে এবং দেখুন এটি কী ফেরত দেয়।
#!/usr/bin/env bashecho" ============================="ps -ef --forest | grep -i bashecho "============================"ইকো "পিআইডি ইউজিং $ ফর স্ক্রিপ্ট $0 ==> $$"ইকো" পিআইডি স্ক্রিপ্টের জন্য ব্যাশপিড ব্যবহার করছে $0 ==> $BASHPID"ইকো
এখন আবার স্ক্রিপ্ট চালান।
$ ./sample.sh
ঠিক আছে, এটি একই প্রক্রিয়া আইডি প্রদান করে। এখানে আসল পার্থক্য আসে। চলুন parentheses()-এর ভিতরে একটি কমান্ড চালিয়ে স্ক্রিপ্টের ভিতরে আরেকটি চাইল্ড প্রক্রিয়া তৈরি করি .
# একটি পরিবর্তনশীল মধ্যে পিআইডি সংরক্ষণ করা…VAR_HASH=$(echo $$)VAR_BASHPID=$(echo $BASHPID)echo "VAR_HASH এর মূল্য ==> $VAR_HASH"echo "VAR_BASHPID এর মান ==> $VAR_BASHPID" /প্রে>![]()
![]()
ব্যাশে, বন্ধনী একটি শিশু প্রক্রিয়া শুরু করবে এবং বন্ধনীর ভিতরে যা আসে তা চালাবে। সেই ক্ষেত্রে, উভয়ই
$এবং$BASHPIDএকটি নতুন শিশু প্রক্রিয়া আইডি সংরক্ষণ করা উচিত। কিন্তু উপরের চিত্র থেকে, আপনি দেখতে পাচ্ছেন যেখানে$একটি পার্থক্য রয়েছে দোকান 382 যেটি প্যারেন্ট আইডি (স্ক্রিপ্টের প্রসেস আইডি sample.sh ), এবং$BASHPIDবন্ধনী দ্বারা নির্মিত শিশু প্রক্রিয়া আইডি সংরক্ষণ করে।এখন এই আচরণ বোঝার চেষ্টা করা যাক। আমরা দেখব ম্যান পেজ কি বলে।
$ man bash![]()
![]()
![]()
![]()
যখন আপনি
$ব্যবহার করেন , এমনকি একটি সাবশেলের মধ্যেও, এটি প্যারেন্ট প্রসেসের প্রসেস আইডি সংরক্ষণ করে যেটি থেকে এটি তৈরি হয়েছে। কিন্তুBASHPIDবর্তমান প্রসেস আইডি সংরক্ষণ করবে, যেমন বন্ধনীর ভিতরে ডাকা হলে এটি চাইল্ড প্রসেস আইডি সংরক্ষণ করবে।আমরা পরিবর্তনশীল
$বরাদ্দ বা পরিবর্তন করতে পারি না , কিন্তুBASHPIDপুনরায় বরাদ্দ করা যেতে পারে কিন্তু এর কোন প্রভাব নেই।$ $=10$ BASHPID=10$ প্রতিধ্বনি $BASHPID![]()
BASHPID আনসেট করা সম্ভব . আপনি যখন আনসেট করেন তখন এটি তার বিশেষ অবস্থা হারায় এবং আপনি এটিকে একটি সাধারণ পরিবর্তনশীল হিসাবে ব্যবহার করা শুরু করতে পারেন৷
$ আনসেট BASHPID$ echo $BASHPID$ BASHPID="Tecmint"$ echo $BASHPID![]()
এমনকি আপনি শেলটির প্রসেস আইডি বরাদ্দ করার চেষ্টা করলেও এটি একটি ব্যবহারকারী-সংজ্ঞায়িত পরিবর্তনশীল হিসাবে বিবেচিত হবে কারণ এটি ইতিমধ্যেই তার বিশেষ অবস্থা হারিয়েছে৷
$ BASHPID=$(echo $$)$ echo $$;echo $BASHPID![]()
এই ক্ষেত্রে, আপনাকে BASHPID-এর জন্য একটি নতুন টার্মিনাল সেশন ব্যবহার করতে হবে এর বিশেষ অবস্থা পেতে।
এই নিবন্ধের জন্য এটি। আমরা
$এর মধ্যে পার্থক্য দেখেছি এবংBASHPIDএবং কিভাবে তারা এই নিবন্ধে আচরণ. এই নিবন্ধটি দেখুন এবং আপনার মূল্যবান মতামত আমাদের সাথে শেয়ার করুন।