शेल स्क्रिप्ट्स में ट्रैप हैंडलिंग और निहित सबस्क्रिप्शन


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

जवाबों:


8

बैश trapबिलिन कीवर्ड की अनुमति देता है RETURN। इसलिए परिवर्तन:

trap mytrap EXIT

सेवा:

trap mytrap RETURN

की चर्चा देखें trapमें खोल-builtins

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.