मेरे द्वारा प्राप्त किए गए उत्तरों के आधार पर (दूसरों पर एक को चुनना मुश्किल था), एक बाहर निकलने वाले कोड का उपयोग करके कुछ प्रकार की त्रुटियों को इंगित करना हानिकारक नहीं है जो बैश भी उपयोग करता है। यदि कोई उपयोगकर्ता स्क्रिप्ट इनमें से किसी एक त्रुटि कोड के साथ बाहर निकलती है, तो बैश (या कोई अन्य यूनिक्स शेल) कुछ विशेष नहीं करेगा (जैसे कि अपवाद हैंडलर चलाना)।
ऐसा लगता है कि उन्नत बैश-स्क्रिप्टिंग गाइड के लेखक बीएसडी से बाहर निकलने के कोड ( sysexits.h
) को मानकीकृत करने के प्रयासों से सहमत हैं और बस सिफारिश कर रहे हैं कि जब उपयोगकर्ता शेल स्क्रिप्ट लिखते हैं, तो वे एग्ज़िट कोड निर्दिष्ट नहीं करते हैं जो पहले से निर्धारित निकास कोड के साथ संघर्ष करते हैं। उपयोग में, यानी, उन्होंने अपने कस्टम एक्ज़िट कोड्स को 64-113 रेंज में 50 उपलब्ध स्टेटस कोड्स तक सीमित कर दिया है।
मैं इस विचार (और तर्क) की सराहना करता हूं, लेकिन मैंने पसंद किया है यदि लेखक अधिक स्पष्ट था कि सलाह को नजरअंदाज करना हानिकारक नहीं है - उन मामलों से अलग, जहां एक स्क्रिप्ट का उपभोक्ता त्रुटियों की जांच कर रहा है जैसे कि 127 का उदाहरण दिया गया है ( command not found
)।
प्रासंगिक POSIX विनिर्देशों
मैंने शोध किया कि एग्ज़िट कोड के बारे में पॉसिक्स का क्या कहना है और पॉसिक्स स्पेसिफिकेशन एडवांस बैश-स्क्रिप्टिंग गाइड के लेखक के साथ मिलकर लगता है। मैंने प्रासंगिक POSIX विनिर्देशों (मेरा जोर) उद्धृत किया है:
कमांड के लिए स्थिति से बाहर निकलें
प्रत्येक कमांड में एक निकास स्थिति होती है जो अन्य शेल कमांड के व्यवहार को प्रभावित कर सकती है। इस खंड में उपयोगिताओं का आदेश न देने वाली स्थिति का दस्तावेजीकरण किया गया है। मानक उपयोगिताओं की निकास स्थिति उनके संबंधित वर्गों में प्रलेखित है।
यदि कोई कमांड नहीं मिली है, तो निकास स्थिति 127 होगी। यदि कमांड नाम पाया जाता है, लेकिन यह निष्पादन योग्य उपयोगिता नहीं है, तो निकास स्थिति 126 होगी। शेल का उपयोग किए बिना उपयोगिताओं को लागू करने वाले अनुप्रयोग इन निकास स्थिति मूल्यों का उपयोग करना चाहिए इसी तरह की त्रुटियों की रिपोर्ट करने के लिए।
यदि शब्द विस्तार या पुनर्निर्देशन के दौरान कोई कमांड विफल रहता है, तो इसकी निकास स्थिति शून्य से अधिक होगी।
आंतरिक रूप से, यह तय करने के प्रयोजनों के लिए कि क्या कोई आदेश गैर-शून्य निकास स्थिति के साथ बाहर निकलता है, शेल प्रतीक्षा के बराबर () फ़ंक्शन WEXITSTATUS मैक्रो के अनुसार कमांड के लिए प्राप्त पूरे स्थिति मान को पहचान लेगा (जैसा कि सिस्टम इंटरफ़ेस में परिभाषित किया गया है) POSIX.1-2008)। विशेष पैरामीटर '?' के साथ बाहर निकलने की स्थिति की रिपोर्ट करते समय, शेल निकास स्थिति की पूर्ण आठ बिट्स की रिपोर्ट करेगा। एक आदेश की समाप्ति स्थिति जिसे एक संकेत प्राप्त हुआ क्योंकि उसे 128 से अधिक बताया जाएगा।
exit
उपयोगिता
के रूप में अन्य वर्गों में बताया गया है, कुछ बाहर निकलें स्थिति मानों दिया है सुरक्षित विशेष उपयोगों के लिए और चाहिए केवल उन उद्देश्यों के लिए आवेदन पत्र द्वारा इस्तेमाल किया जा:
126
- निष्पादित की जाने वाली एक फाइल मिली थी, लेकिन यह निष्पादन योग्य उपयोगिता नहीं थी।
127
- निष्पादित की जाने वाली उपयोगिता नहीं मिली।
>128
- एक सिग्नल द्वारा एक कमांड को बाधित किया गया था।
अग्रिम जानकारी
इसकी कीमत क्या है, इसके लिए मैं सभी का सत्यापन करने में सक्षम था, लेकिन विशेष साधनों के साथ एग्जिट कोड की सूची में से एक । एक्ज़िट कोड्स की यह सारणी उपयोगी है क्योंकि यह अधिक विवरण प्रदान करती है - और बश संदर्भ में प्रलेखित त्रुटि कोड उत्पन्न करने के तरीके ।
128 से बाहर निकलने की स्थिति उत्पन्न करने का प्रयास
बैश संस्करणों 3.2.25 और 4.2.46 का उपयोग करते हुए, मैंने एक 128 Invalid argument to exit
त्रुटि फेंकने की कोशिश की लेकिन हर बार मुझे 255 (सीमा से बाहर निकलने की स्थिति) प्राप्त हुई। उदाहरण के लिए, यदि exit 3.14159
इसे शेल स्क्रिप्ट या इंटरेक्टिव चाइल्ड शेल के भाग के रूप में निष्पादित किया जाता है, तो शेल एक कोड के साथ बाहर निकलता है 255
:
$ exit 3.14159
exit
bash: exit: 3.14159: numeric argument required
और भी मज़ेदार के लिए, मैंने एक साधारण सी प्रोग्राम चलाने की कोशिश की, लेकिन इस मामले में, ऐसा लगता है कि exit(3)
फ़ंक्शन ने फ़्लोटिंग को बाहर निकलने से पहले एक इंट (3 इस मामले में) में बदल दिया:
#include <stdlib.h>
main()
{
exit(3.14159);
}