ধরা যাক আপনার কাছে একটি শেল স্ক্রিপ্ট রয়েছে যা কোনও EXIT
ফাঁদ দিয়ে কিছু ধরণের ক্লিনআপ কোড চালায় :
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
trap mytrap exit
echo I am at the end of the script.
প্রত্যাশা অনুযায়ী, It's a trap!
এটি স্ক্রিপ্টটি প্রস্থান করার পরে মুদ্রণ করবে :
$ sh myscript
I am at the end of the script.
It's a trap!
আপনি কোনও ফাংশন যুক্ত করতে স্ক্রিপ্টটি পরিবর্তন করুন যা কিছু আউটপুট উত্পন্ন করে যা শেষ পর্যন্ত অন্য কমান্ডে পাইপ হয়:
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
myfunc () {
echo "I've got a bad feeling about this..."
}
trap mytrap exit
myfunc | cat > /dev/null
echo I am at the end of the script.
পাইপের কারণে, কোডটি myfunc
একটি সাব-শেলের মধ্যে চালিত হয় ... এবং সাব-শেলগুলি trap
পিতামাতার আচরণের উত্তরাধিকার বলে মনে হয় না , যার অর্থ এখানে যদি আপনি এমন কোনও ক্রিয়া সম্পাদন করেন যা আপনার ট্র্যাপ কোড দ্বারা সাফ হওয়া উচিত যা জিতেছে ' ঘটবে না
সুতরাং আপনি এটি চেষ্টা করুন:
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
}
mytrap
সাবস্কেলটি প্রস্থান করলে এবং এটি এখনও ট্রিগার করতে ব্যর্থ হয় । দেখা যাচ্ছে যে আপনার exit
যেমন একটি স্পষ্ট প্রয়োজন ,
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
exit
}
উপরের কোড সহ, mytrap
সাব-শেল থেকে প্রস্থান করার সময় যথাযথভাবে ট্রিগার করবে:
$ sh myscript
It's a trap!
I am at the end of the script.
It's a trap!
এটা কি প্রত্যাশিত আচরণ? আমি এখানে বেশ কয়েকটি জিনিস দ্বারা অবাক হয়েছিল:
trap
সেটিংস সাব-শেল দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হয় নি- একটি সাব-শেল থেকে অন্তর্নিহিত প্রস্থান কোনও
EXIT
ফাঁদ ট্রিগার হিসাবে উপস্থিত হয় না