সাধারণ অত্যাবশ্যক প্রোগ্রামিংয়ে , আপনি নির্দেশের অনুক্রম লিখেন এবং সেগুলি একের পর এক নির্বাহ করা হয়, সুস্পষ্ট নিয়ন্ত্রণ প্রবাহের মাধ্যমে। উদাহরণ স্বরূপ:
if [ -f file1 ]; then # If file1 exists ...
cp file1 file2 # ... create file2 as a copy of a file1
fi
প্রভৃতি
যেমন উদাহরণ থেকে দেখা যায়, জরুরী প্রোগ্রামিংয়ে আপনি মৃত্যুদণ্ড প্রবাহকে বেশ সহজেই অনুসরণ করেন এবং কার্যকর কোডটি নির্ধারণের জন্য প্রদত্ত কোডের কোনও লাইন থেকে সর্বদা আপনার পথ চালিয়ে যাচ্ছেন তা জেনেও যে আপনার দেওয়া নির্দেশাবলী তার ফলস্বরূপ কার্যকর হবে? প্রবাহে অবস্থান (বা তাদের কল সাইটের অবস্থানগুলি, যদি আপনি ফাংশন লিখছেন)।
কলব্যাকগুলি কীভাবে প্রবাহকে পরিবর্তন করে
আপনি যখন কলব্যাকগুলি ব্যবহার করেন, "ভৌগলিকভাবে" নির্দেশাবলীর একটি সেট ব্যবহার না করে আপনি কখন এটি ডাকা উচিত তা বর্ণনা করেন। অন্যান্য প্রোগ্রামিং পরিবেশে সাধারণ উদাহরণগুলি হ'ল "এই সংস্থানটি ডাউনলোড করুন এবং ডাউনলোড শেষ হয়ে গেলে এই কলব্যাকটি কল করুন" cases বাশের এই ধরণের জেনেরিক কলব্যাক কনস্ট্রাক্ট নেই, তবে ত্রুটি-পরিচালনা ও অন্যান্য কয়েকটি পরিস্থিতিতে এটির কলব্যাক রয়েছে ; উদাহরণস্বরূপ (সেই উদাহরণটি বুঝতে প্রথমে কমান্ড সাবস্টিটিউশন এবং বাশ প্রস্থান পদ্ধতি বুঝতে হবে):
#!/bin/bash
scripttmp=$(mktemp -d) # Create a temporary directory (these will usually be created under /tmp or /var/tmp/)
cleanup() { # Declare a cleanup function
rm -rf "${scripttmp}" # ... which deletes the temporary directory we just created
}
trap cleanup EXIT # Ask Bash to call cleanup on exit
আপনি যদি নিজে চেষ্টা করে দেখতে চান তবে উপরের ফাইলটিকে একটি ফাইলে সংরক্ষণ করুন, বলুন cleanUpOnExit.sh
, এটি কার্যকর করুন এবং চালনা করুন:
chmod 755 cleanUpOnExit.sh
./cleanUpOnExit.sh
আমার কোড এখানে স্পষ্টভাবে cleanup
ফাংশন কল করে না ; এটি বাশকে কখন ফোন করবে তা বলছে trap cleanup EXIT
, অর্থাত্ "প্রিয় বাশ, cleanup
আপনি প্রস্থান করার সময় দয়া করে কমান্ডটি চালান " (এবং cleanup
এটি আমি আগে সংজ্ঞায়িত একটি ফাংশন বলে মনে করি, তবে এটি বাশ বুঝতে পারে এমন কিছু হতে পারে)। বাশ এটি সমস্ত অ-মারাত্মক সংকেত, প্রস্থান, কমান্ড ব্যর্থতা এবং সাধারণ ডিবাগিংয়ের জন্য সমর্থন করে (আপনি একটি কলব্যাক নির্দিষ্ট করতে পারবেন যা প্রতিটি কমান্ডের আগে চলমান)। এখানে কলব্যাকটি হ'ল cleanup
ফাংশন, যা শশটি প্রস্থান করার ঠিক আগে বাশ দ্বারা "ফিরে" বলে।
কলব্যাকমুখী কাঠামো তৈরি করতে আপনি কমান্ড হিসাবে শেল প্যারামিটারগুলি মূল্যায়নের বাশের ক্ষমতা ব্যবহার করতে পারেন; এটি এই উত্তরের পরিধি থেকে কিছুটা অতিক্রম করে এবং সম্ভবত আরও পরামর্শ দেয় যে আরও প্রায় বিভ্রান্তির কারণ হতে পারে যে চারপাশে পাস করার ক্ষেত্রে সর্বদা কলব্যাক জড়িত। বাশ দেখুন : অন্তর্নিহিত কার্যকারিতার কয়েকটি উদাহরণের জন্য প্যারামিটার হিসাবে একটি ফাংশন পাস করুন । ইভেন্ট-হ্যান্ডলিং কলব্যাকগুলির মতো এখানে ধারণাটি হ'ল ফাংশনগুলি প্যারামিটার হিসাবে ডেটা নিতে পারে তবে অন্যান্য ফাংশনও - এটি কলকারীদের আচরণের পাশাপাশি ডেটা সরবরাহ করতে দেয়। এই পদ্ধতির একটি সাধারণ উদাহরণ দেখতে পারে
#!/bin/bash
doonall() {
command="$1"
shift
for arg; do
"${command}" "${arg}"
done
}
backup() {
mkdir -p ~/backup
cp "$1" ~/backup
}
doonall backup "$@"
(আমি জানি এটি কিছুটা অকেজো কারণ যেহেতু cp
একাধিক ফাইল ডিল করতে পারে এটি কেবল উদাহরণের জন্য))
এখানে আমরা একটি ফাংশন তৈরি করি doonall
, যা প্যারামিটার হিসাবে দেওয়া অন্য একটি কমান্ড নেয় এবং এটি এর বাকি পরামিতিগুলিতে প্রয়োগ করে; তারপরে আমরা backup
স্ক্রিপ্টকে দেওয়া সমস্ত পরামিতিগুলিতে ফাংশনটি কল করতে এটি ব্যবহার করি । ফলাফলটি এমন একটি স্ক্রিপ্ট যা এর সমস্ত যুক্তিগুলি একে একে ব্যাকআপ ডিরেক্টরিতে অনুলিপি করে।
এই ধরণের পদ্ধতির ফলে একক দায়িত্ব নিয়ে ফাংশনগুলি লেখার মঞ্জুরি পাওয়া যায়: doonall
এর দায়িত্ব হল এর সমস্ত যুক্তিগুলির সাথে কিছু চালানো, একবারে একটি; backup
এর দায়িত্ব হ'ল ব্যাকআপ ডিরেক্টরিতে এর (একমাত্র) যুক্তির অনুলিপি করা। উভয়ই doonall
এবং backup
অন্যান্য প্রসঙ্গে ব্যবহার করা যেতে পারে, যা আরও কোড পুনরায় ব্যবহার, আরও ভাল পরীক্ষা ইত্যাদির অনুমতি দেয় etc.
এক্ষেত্রে কলব্যাক হ'ল backup
ফাংশন, যা আমরা এর doonall
প্রতিটি অন্যান্য আর্গুমেন্টের "কল ব্যাক" করতে বলি - আমরা doonall
আচরণ (এর প্রথম যুক্তি) পাশাপাশি ডেটা (বাকী যুক্তি) সরবরাহ করি।
(দ্রষ্টব্য যে দ্বিতীয় ধরণের ব্যবহারের ক্ষেত্রে যে ধরণের ব্যবহারের ক্ষেত্রে প্রদর্শিত হয়েছিল, আমি নিজেই "কলব্যাক" শব্দটি ব্যবহার করব না, তবে এটি সম্ভবত আমার ব্যবহার করা ভাষাগুলির ফলস্বরূপ অভ্যাস। , ইভেন্ট-ভিত্তিক সিস্টেমে কলব্যাকগুলি নিবন্ধিত করার পরিবর্তে)