2012-02-10 9 views
6

की घोषणा के बाद वैर सिग्नल कैप्चर वैरिएबल का पता नहीं लगा, मेरे पास जेनेरिक क्लीनअप कोड का एक गुच्छा है जिसे किसी निश्चित बैश स्क्रिप्ट से बाहर निकलने की आवश्यकता होती है, चाहे वह सामान्य रूप से बाहर हो या बाधित हो। मुझे लगा कि मैं इसे प्राप्त करने के लिए trap "..." EXIT स्यूडोसिग्नल का उपयोग करूंगा।'ट्रैप' ब्लॉक

जेनेरिक क्लीनअप सामान के अतिरिक्त, विशिष्ट सफाई का एक टुकड़ा भी है जो केवल स्क्रिप्ट पूर्ण होने पर ही किया जाना चाहिए। मैंने सोचा कि मैं 'जाल' ब्लॉक एक चर का परीक्षण, इसलिए की तरह होने से यह चालू कर सकते:

#!/bin/bash 
done=false; 
trap "{   
      #generic cleanup code goes here. 
      if $done 
      then 
       #cleanup to be done only on completion goes here. 
       echo Test; 
      fi 
     }" EXIT 
#main script goes here 
done=true; 

बहरहाल, यह काम नहीं करता। निम्न कोड चलाना कभी भी "टेस्ट" गूंज नहीं करेगा। done=true; के बाद एक स्पष्ट exit कॉल जोड़ना कुछ भी नहीं बदलेगा। मैं क्या खो रहा हूँ?

चीयर्स!

उत्तर

13

जाल को अलग किया जा रहा है, और जब इसे निष्पादित किए जाने के बजाय जाल को परिभाषित किया जा रहा है, तब $ $ के मूल्य का उपयोग कर रहा है। आप जाल परिभाषा के चारों ओर एकल उद्धरण का उपयोग कर सकते हैं, या एक समारोह को परिभाषित कर सकते हैं। एक समारोह को परिभाषित करना शायद क्लीनर है:

 
#!/bin/sh 
done=false 
cleanup() { if $done; then echo Test; fi; } 
trap cleanup EXIT 
done=true 

यह काम करता है क्योंकि समारोह में चर के विस्तार के बजाय जब समारोह परिभाषित किया गया है की तुलना में समारोह कहा जाता है जब तक आस्थगित है।