अगर मैं http://linuxcommand.org/wss0160.php#traptrap
पर वर्णित उदाहरण का उपयोग करता हूं हूं, बाहर निकलने से पहले ctrl-c (या समान) और क्लीनअप को पकड़ने के लिए तो मैं बाहर निकले कोड को बदल रहा हूं।
अब यह शायद वास्तविक दुनिया में अंतर नहीं करेगा (उदाहरण के लिए, क्योंकि बाहर निकलने वाले कोड पोर्टेबल नहीं हैं और उसके शीर्ष पर हमेशा नहीं होते हैं जैसा कि डिफ़ॉल्ट निकास कोड में चर्चा की जाती है जब प्रक्रिया समाप्त हो जाती है? ) लेकिन फिर भी मैं सोच रहा हूं कि क्या वहाँ है? वास्तव में इसे रोकने और इसके बजाय बाधित स्क्रिप्ट के लिए डिफ़ॉल्ट त्रुटि कोड वापस करने का कोई तरीका नहीं है?
उदाहरण (बाश में, लेकिन मेरे प्रश्न को बाश-विशिष्ट नहीं माना जाना चाहिए):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
आउटपुट:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(इसे और अधिक POSIX- अनुरूप बनाने के लिए निकालने का संपादन किया गया।)
(इसके बजाय इसे बैश स्क्रिप्ट बनाने के लिए फिर से संपादित किया गया, मेरा सवाल हालांकि शेल-विशिष्ट नहीं है।)
गैर-पोर्टेबल "SIGINT" के पक्ष में जाल के लिए पोर्टेबल "INT" का उपयोग करने के लिए संपादित।
बेकार घुंघराले ब्रेसिज़ को हटाने और संभावित समाधान जोड़ने के लिए संपादित।
अपडेट करें:
मैंने इसे अभी हल किया है केवल कुछ त्रुटि कोड के साथ बाहर निकलकर हार्डकोड और फंसाने वाला EXIT। यह कुछ प्रणालियों पर समस्याग्रस्त हो सकता है क्योंकि त्रुटि कोड भिन्न हो सकता है या EXIT जाल संभव नहीं है, लेकिन मेरे मामले में यह ठीक है।
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
है कि वर्तमान कोप्रोसेस से इनपुट पढ़ता है।
read
वर्तमान कॉपीरो से पढ़ने के लिएtrap cmd SIGINT
कहते हैं और यह काम नहीं करेगा क्योंकि मानक कहता है कि आपको उपयोग करना चाहिएtrap cmd INT
।