ফাঁদে হ্যান্ডলিং এবং শেল স্ক্রিপ্টগুলিতে অন্তর্ভুক্ত সাবস্কেলগুলি


12

ধরা যাক আপনার কাছে একটি শেল স্ক্রিপ্ট রয়েছে যা কোনও 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 ফাঁদ ট্রিগার হিসাবে উপস্থিত হয় না

উত্তর:


8

ব্যাশ trapবিল্টিন কীওয়ার্ডটির অনুমতি দেয় RETURN। সুতরাং পরিবর্তন:

trap mytrap EXIT

প্রতি:

trap mytrap RETURN

এর আলোচনা দেখুন trapমধ্যে শেল-builtins

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.