मान लीजिए कि आपके पास एक शेल स्क्रिप्ट है जो किसी प्रकार के 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
माता-पिता के व्यवहार को विरासत में देने के लिए प्रकट नहीं होती है , जिसका अर्थ है कि यदि आप यहां कोई कार्य करते हैं, जिसे आपके ट्रैप कोड द्वारा साफ किया जाना चाहिए जो जीता है ' t होता है।
तो आप यह कोशिश करें:
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
जाल को ट्रिगर करने के लिए प्रकट नहीं होता है