বাশ এবং AS BASHPID এর মধ্যে পার্থক্য শিখুন


সম্প্রতি আমি একটি শেল স্ক্রিপ্টে কাজ করছিলাম এবং আমি কীভাবে বিশেষ বিশেষ ভেরিয়েবল $ এবং BASHPID আচরণ করে তার মধ্যে একটি উল্লেখযোগ্য পার্থক্য দেখেছি। লিনাক্সে চলমান প্রতিটি প্রক্রিয়া একটি প্রসেস আইডি সহ নির্ধারিত হবে এবং অপারেটিং সিস্টেমটি প্রক্রিয়াটি পরিচালনা করে how

একইভাবে, আপনার বাশ টার্মিনাল সেশনটিও একটি প্রক্রিয়া আইডির সাথে নির্ধারিত হবে। "$" এবং "AS BASHPID" নামে একটি বিশেষ ভেরিয়েবল রয়েছে যা বর্তমান শেলের প্রসেস আইডি সঞ্চয় করে।

আপনার বর্তমান শেলের প্রসেস আইডিটি কী তা দেখতে নীচের কমান্ডটি চালিয়ে যান। "$" এবং "AS BASHPID" উভয়ই একই মান ফিরতে চলেছে।

$ echo $$               # Printing special variable $
$ echo $BASHPID         # Printing the varibale $BASHPID

ব্যাশে যখন আমরা শেল থেকে যে কোনও বাহ্যিক প্রোগ্রামকে কল করি, এটি একটি শিশু প্রক্রিয়া/সাবশেল তৈরি করবে এবং প্রোগ্রামটি কেবল শিশু প্রক্রিয়াতে জমা দেওয়া হবে। নীচের উদাহরণটি দেখুন যেখানে আমি "স্যাম্পেল.শ" নামে একটি স্ক্রিপ্টে একটি সাধারণ প্রক্রিয়া মনিটর কমান্ডটি রেখেছি তা দেখানোর জন্য যে প্যারেন্ট শেল কীভাবে প্রোগ্রামটি চালানোর জন্য সাবসেল তৈরি করে।

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

এখন এই স্ক্রিপ্টটি চালানোর সময় আমরা ব্যাশের প্রক্রিয়া আইডি পেতে পারি। নীচের চিত্রটি থেকে আপনি বুঝতে পারবেন যে আমি যখন স্ক্রিপ্ট বাশ বলি তখন একটি শিশু প্রক্রিয়া তৈরি করে এবং স্ক্রিপ্টটি চালায়।

$ ./sample.sh

এখন স্ক্রিপ্টের মধ্যে "$" এবং "AS 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

ঠিক আছে, এটি একই প্রক্রিয়া আইডি প্রদান করে। এখানে আসল আসল পার্থক্য। আসুন বন্ধনী() এর ভিতরে একটি কমান্ড চালিয়ে স্ক্রিপ্টের মধ্যে অন্য একটি শিশু প্রক্রিয়া তৈরি করি।

# 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"

ব্যাশে, প্যারেন্টিসিস একটি শিশু প্রক্রিয়া শুরু করবে এবং প্রথম বন্ধনীগুলির মধ্যে যা আসে তা চালাবে। সেক্ষেত্রে $ এবং AS BASHPID উভয়েরই একটি নতুন শিশু প্রক্রিয়া আইডি সংরক্ষণ করা উচিত। তবে উপরের চিত্রটি থেকে আপনি দেখতে পাচ্ছেন যে $ 382 সংরক্ষণ করে যা প্যারেন্ট আইডি (স্ক্রিপ্ট নমুনার প্রসেস আইডি) এবং AS বাসপিড বন্ধনী দ্বারা তৈরি করা শিশু প্রক্রিয়া আইডি সঞ্চয় করে।

এখন আসুন এই আচরণটি বোঝার চেষ্টা করি। ম্যান পেজ কী বলে তা আমরা দেখতে পাব।

$ man bash

আপনি যখন $ ব্যবহার করেন এমনকি একটি সাব-শেলও, এটি যে প্যারেন্ট প্রসেসটি তৈরি হয়েছিল তার প্রসেস আইডি সংরক্ষণ করে। তবে BASHPID বর্তমান প্রক্রিয়া আইডি সংরক্ষণ করবে, অর্থাৎ যখন প্রথম বন্ধনীর ভিতরে ডাকা হবে এটি শিশু প্রক্রিয়া আইডি সংরক্ষণ করবে।

আমরা vari পরিবর্তনশীলটি বরাদ্দ বা সংশোধন করতে পারি না, তবে BASHPID পুনরায় নিয়োগ দেওয়া যেতে পারে তবে এর কোনও প্রভাব নেই।

$ $=10
$ BASHPID=10
$ echo $BASHPID

BASHPID আনসেট করা সম্ভব। আপনি যখন আনসেট না করেন তখন এটির বিশেষ অবস্থাটি হারাবে এবং আপনি এটি একটি সাধারণ পরিবর্তনশীল হিসাবে ব্যবহার করতে শুরু করতে পারেন।

$ unset BASHPID
$ echo $BASHPID
$ BASHPID="Tecmint"
$ echo $BASHPID

এমনকি যদি আপনি শেলের প্রসেস আইডি নির্ধারণ করার চেষ্টা করেন তবে এটি ইতিমধ্যে এর বিশেষ অবস্থা হারিয়ে যাওয়ার কারণে এটি একটি ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবল হিসাবে বিবেচিত হবে।

$ BASHPID=$(echo $$)
$ echo $$;echo $BASHPID

এই ক্ষেত্রে, আপনাকে BASHPID এর বিশেষ রাজ্য পেতে একটি নতুন টার্মিনাল সেশন ব্যবহার করতে হবে।

এই নিবন্ধটির জন্য এটি। আমরা $ এবং BASHPID এর মধ্যে পার্থক্য দেখেছি এবং এই নিবন্ধে তারা কীভাবে আচরণ করে। এই নিবন্ধটি মাধ্যমে যান এবং আমাদের সাথে আপনার মূল্যবান প্রতিক্রিয়া শেয়ার করুন।