क्यों 0 सच है, लेकिन झूठ 1 खोल में है?


122
false; echo $?

उपरोक्त आउटपुट होगा 1, जो अन्य सभी प्रोग्रामिंग भाषाओं के साथ विरोधाभासी है जो मुझे पता है।

इसमें कोई कारण?


3
यह यूनिक्स वे के अनुरूप भी है ... सफलता पर कुछ भी वापस न करें।
अब्दुल्ला जिबली

21
क्योंकि बाहर निकलने की स्थिति एक बूलियन नहीं है। इतना ही आसान।
जेन्स

2
ध्यान रखें कि falseअन्य प्रोग्रामिंग भाषाओं की तरह, बूलियन नहीं है। यह सिर्फ /bin/false( /usr/bin/falseमैक पर) एक कार्यक्रम है जो हमेशा एक त्रुटि निकास कोड वापस करने के लिए होता है true। 1. इसके लिए समान । इसलिए यहां कास्टिंग जैसी कोई चीज नहीं है। यह सभी बाहर निकलने के कोड के बारे में है।
मिखाइल वासिन

एक शेल एक ऑपरेटिंग सिस्टम के लिए एक (उपयोगकर्ता) इंटरफ़ेस है। यूनिक्स आदि कार्यक्रम 0 के रूप में बाहर निकलने के सम्मेलन का पालन करते हैं, जवाब में दिए गए कारण के लिए (एक से अधिक असफलता संवाद करने की क्षमता)। खोल बस इस सम्मेलन को बनाए रखता है, जो निर्माण को if myprog; then echo OK; fiआसान और सहज बनाता है । अन्यथा आपको किसी कार्यक्रम की सफलता के लिए हर परीक्षा को पलटना होगा!
पीटर -

जवाबों:


93

यह एक सम्मेलन है, लेकिन जब आप इसके बारे में सोचते हैं तो एक विशेष रूप से उपयोगी होता है। सामान्य तौर पर, यदि कोई प्रोग्राम सफल होता है, जिसे आपको जानना आवश्यक है। यदि यह विफल हो जाता है, हालांकि, आपको विफलता के बारे में सभी प्रकार की जानकारी जानने की आवश्यकता हो सकती है - ऐसा क्यों हुआ, इसे कैसे ठीक किया जाए, आदि शून्य अर्थ 'सफलता' और गैर-शून्य मतलब विफलता होने से आप सफलता के लिए बहुत आसानी से जांच कर सकते हैं। , और यदि आप चाहते हैं तो अधिक विवरण के लिए विशेष त्रुटि की जांच करें। बहुत सारे एपीआई और फ्रेमवर्क में एक समान सम्मेलन होता है - फ़ंक्शंस जो 0 पर वापस आते हैं और जो असफल होते हैं उन्हें एक त्रुटि कोड देता है जो विशेष विफलता के मामले का वर्णन करता है।


6
मैं इस उत्तर को समझता हूं, लेकिन मुझे अभी भी नहीं पता है कि इंट कन्वर्शन के लिए बूल उलटा क्यों होता है। क्या कोई "रिटर्न बूलियन कन्वेंशन" है जो कहता है: यदि आप सच लौटाते हैं, तो इसका मतलब है कि कोई त्रुटि नहीं है, अगर आप झूठे हैं, तो इसका मतलब है कि एक त्रुटि हुई है (जैसे "पूर्णांक = त्रुटि कोड सम्मेलन" जो अधिक प्रसिद्ध है)?
गुइलुइमोरी

1
मान लीजिए कि अंतर रूपांतरण के लिए एक बूलियन है जिसका अर्थ है कि आप वास्तव में उत्तर को नहीं समझ पाए हैं। शून्य का मतलब है सफलता और सभी 1, 2, ..., 255 त्रुटि कोड हैं जो विभिन्न विफलता परिदृश्यों को उपयोगी रूप से संवाद कर सकते हैं। एक विशेष उदाहरण है xargsजो 127 के आसपास सीमा में विभिन्न त्रुटि कोड का उपयोग करता है यह इंगित करने के लिए कि कमांड का एक समूह कैसे विफल हुआ। जो रूपांतरण किया जा सकता है वह बूल के लिए है जहां 0 मानचित्र सफलता के लिए है (जो मुझे लगता है कि आप इसे सच / 1 के रूप में व्यक्त करना चाहते हैं; लेकिन महसूस करें कि यह सिर्फ एक और मनमाना सम्मेलन है) और अन्य सभी मान विफलता के लिए।
ट्रिपलए

79

बैश एक प्रोग्रामिंग (स्क्रिप्टिंग) भाषा है, लेकिन यह एक शेल और एक यूजर-इंटरफेस भी है। यदि 0त्रुटि थी, तो प्रोग्राम केवल एक प्रकार की त्रुटि प्रस्तुत कर सकता है।

हालाँकि, बैश में, कोई भी नॉनज़ेरो वैल्यू एक त्रुटि है, और हम किसी भी संख्या का उपयोग 1-255 से किसी त्रुटि का प्रतिनिधित्व करने के लिए कर सकते हैं। इसका मतलब है कि हमारे पास कई तरह की त्रुटियाँ हो सकती हैं। 1एक सामान्य त्रुटि है, 126इसका अर्थ है कि किसी फ़ाइल को निष्पादित नहीं किया जा सकता है, 127जिसका अर्थ है 'कमांड नहीं मिला', आदि। यहां बैश एग्ज़िट कोड्स की एक सूची है जिसमें विशेष अर्थ कुछ सबसे आम निकास कोड दिखाते हैं।

कई तरह की सफलता (एक्जिट स्टेटस है 0) भी है। हालाँकि, एक सफलता आपको अगले चरण पर जाने की अनुमति देगी- आप परिणाम को स्क्रीन पर प्रिंट कर सकते हैं, या कमांड को निष्पादित कर सकते हैं, आदि।


8
विभिन्न प्रकार के रिटर्न कोड की उपयोगिता को दर्शाने वाला यह व्यावहारिक उत्तर कुछ अन्य उत्तरों के उपदेश-उपदेश के लिए बेहतर है।
जवदाबा ०

1
और इसके मज़े के लिए, मैं इंगित करूँगा कि /usr/include/sysexits.hनोट बाहर निकलने के मूल्य हैं, जो शायद अधिक महत्वाकांक्षी हैं, भले ही वे जिस परंपरा का प्रतिनिधित्व करते हैं वह 1980 के दशक की तारीखों का है। यह सम्मेलन बैश के दायरे से बाहर मौजूद है।
घोटी

2
एक महान, सरल और व्यावहारिक व्याख्या। इसके लिए सबसे ऊपर रहने की जरूरत है।
रे लियोनार्ड अमोराटो

3
"यदि 0त्रुटि थी, तो प्रोग्राम केवल एक प्रकार की त्रुटि प्रस्तुत कर सकता है" । यह कथन महत्वपूर्ण है और इस कारण का जवाब सबसे ऊपर होना चाहिए।
रेयरेंग

1
@LuisLavaire यह अपरिभाषित व्यवहार है। व्यवहार में, संख्या कम हो जाती है; लेकिन यह निश्चित रूप से "अधिक गलत" नहीं होगा यदि रनटाइम एक चेतावनी उत्पन्न करता है और / या बस दुर्घटनाग्रस्त हो जाता है। इस जानकारी के लिए OS बिल्कुल एक बाइट आरक्षित करता है और एक से अधिक बाइट डालने का प्रयास निश्चित रूप से एक त्रुटि है। लेकिन ओएस डिजाइनर शायद पहले दिन दुर्घटनाओं में भाग गए, और सिकुड़ गए, और उन्होंने फैसला किया कि वे जो सबसे अच्छा कर सकते हैं वह मूल्य को कम करना और आगे बढ़ना है।
ट्रिपलए

30

यहां दो संबंधित मुद्दे हैं।

सबसे पहले, ओपी का प्रश्न, क्यों 0 सच है लेकिन गलत है 1 शेल में? और दूसरा, आवेदन सफलता के लिए 0 और विफलता के लिए गैर-शून्य क्यों लौटते हैं?

ओपी के प्रश्न का उत्तर देने के लिए हमें दूसरे प्रश्न को समझने की आवश्यकता है। इस पोस्ट के कई उत्तरों ने वर्णन किया है कि यह एक सम्मेलन है और इस सम्मेलन के कुछ उपनामों को सूचीबद्ध किया है। इनमें से कुछ बारीकियों को नीचे संक्षेप में प्रस्तुत किया गया है।

सफलता के लिए आवेदन क्यों 0 और विफलता के लिए गैर-शून्य है?

कोड जो किसी ऑपरेशन को आमंत्रित करता है उसे ऑपरेशन की निकास स्थिति के बारे में दो बातें जानने की आवश्यकता होती है। क्या ऑपरेशन सफलतापूर्वक समाप्त हो गया? [* १] और यदि ऑपरेशन सफलतापूर्वक नहीं निकलता है तो ऑपरेशन असफल क्यों हुआ? सफलता को निरूपित करने के लिए किसी भी मूल्य का उपयोग किया जा सकता है। लेकिन 0 किसी भी अन्य संख्या की तुलना में अधिक सुविधाजनक है क्योंकि यह प्लेटफार्मों के बीच पोर्टेबल है। 16 अगस्त 2011 को इस प्रश्न के उत्तर का संक्षेप :

शून्य एन्कोडिंग-स्वतंत्र है।

अगर हम 32-बिट पूर्णांक शब्द में एक (1) को स्टोर करना चाहते हैं, तो पहला सवाल "बिग-एंडियन शब्द या लिटिल-एंडियन शब्द होगा?", उसके बाद "बाइट्स एक छोटे-एंडियन शब्द की रचना कब तक कर रहे हैं?" ", जबकि शून्य हमेशा एक जैसा दिखेगा।

इसके अलावा यह उम्मीद करने की जरूरत है कि कुछ लोग गलत तरीके से चार या कुछ बिंदु पर या यहां तक ​​कि तैरने के लिए गलत तरीके से डालते हैं। (int) ((char) ENOLCK) ENOLCK नहीं है जब char कम से कम 8-बिट लंबा नहीं है (7-बिट ASCII char Machines UNIX द्वारा समर्थित हैं), जबकि (int) ((char) 0) 0 स्वतंत्र है चार का वास्तु विवरण।

एक बार जब यह निर्धारित किया जाता है कि 0 सफलता के लिए वापसी मूल्य होगा, तो यह विफलता के लिए किसी भी गैर-शून्य मूल्य का उपयोग करने के लिए समझ में आता है। यह कई एग्जिट कोड को इस सवाल का जवाब देने की अनुमति देता है कि ऑपरेशन विफल क्यों हुआ।

क्यों 0 सच है, लेकिन झूठ 1 खोल में है?

गोले के मौलिक उपयोगों में से एक है उन्हें स्क्रिप्टिंग करके प्रक्रियाओं को स्वचालित करना। आमतौर पर इसका अर्थ है किसी ऑपरेशन को लागू करना और फिर ऑपरेशन की निकास स्थिति के आधार पर सशर्त रूप से कुछ और करना। फिलिप ए ने इस पोस्ट के अपने उत्तर में स्पष्ट रूप से समझाया कि

बैश में और सामान्य रूप से यूनिक्स गोले में, वापसी मूल्य बूलियन नहीं हैं। वे पूर्णांक निकास कोड हैं।

फिर यह आवश्यक है कि बूलियन मान के रूप में इन परिचालनों की निकास स्थिति की व्याख्या करें। यह एक सफल मानचित्र बनाने के लिए समझ में आता है (0 ) निकास स्थिति को सच और किसी भी गैर-शून्य / विफलता निकास स्थिति को गलत । ऐसा करने से जंजीर खोल कमांड के सशर्त निष्पादन की अनुमति मिलती है।

यहाँ एक उदाहरण है mkdir deleteme && cd $_ && pwd । क्योंकि शेल 0 की व्याख्या करता है क्योंकि यह आदेश सही रूप में अपेक्षित रूप से काम करता है। यदि शेल 0 को गलत के रूप में व्याख्या करने के लिए था, तो आपको प्रत्येक ऑपरेशन के लिए व्याख्या किए गए निकास स्थिति को उल्टा करना होगा।

संक्षेप में, यह शेल के लिए 0 की व्याख्या करने के लिए निरर्थक होगा, क्योंकि जो एक सफल निकास स्थिति के लिए आवेदन 0 लौटाता है, वह गलत है।


[* १]: हाँ, कई बार ऑपरेशन को केवल एक सरल सफलता संदेश से अधिक वापस करने की आवश्यकता होती है, लेकिन यह इस धागे के दायरे से परे है।

उन्नत बैश-स्क्रिप्टिंग गाइड में परिशिष्ट ई भी देखें


2
हैलो, बस इस बात पर जोर देना कि अगर शून्य शून्य को असत्य और शून्य को सत्य के रूप में व्याख्यायित कर रहा है, तो करने की चाल mkdir deleteme && cd _$ && pwdवास्तव में विफल नहीं होगी; लेकिन हमें इसे प्रतिस्थापित करना होगा mkdir deleteme || cd _$ || pwd, जो मेरी राय में बहुत कम स्पष्ट है, क्योंकि हम वास्तव में जो करना चाहते हैं वह है mkdir deleteme" और " cd _$" और " pwd... ("और" यहां सामान्य भाषा से इसका अर्थ है)।
रमी पियरे

1
मुझे लगता है कि मैंने अपने उत्तर में इसे कवर किया है। स्पष्ट होने के लिए, जब आप तर्क को उल्टा करते हैं, तो यह केवल &&ऑपरेटरों के साथ ||ऑपरेटरों को बदलने के लिए पर्याप्त नहीं है । आपको डी मॉर्गन के कानून को पूरी तरह लागू करने की आवश्यकता होगी। देखें: en.wikipedia.org/wiki/De_Morgan%27s_laws
axiopisty

1
एक और विचार: मुझे कम से कम तीन कारण दिखाई देते हैं, सामान्य आधार पर, यह बताना स्वाभाविक होगा कि trueशून्य से falseमेल खाती है और नॉनजेरो से मेल खाती है। सबसे पहले, अगर मैं आपको कुछ बताता हूं, तो "आपने सच कहा है" यह उस झूठ की संख्या पर निर्भर करता है जो मैंने बताया है: या तो यह शून्य है और मैंने (विश्व स्तर पर) सच कहा है, या यह नॉनजरो है और मैंने झूठ बोला है। यह अनिवार्य रूप से तार्किक and"समान और" के अलावा (जब प्राकृतिक संख्या तक सीमित है, स्पष्ट रूप से) के अनुरूप तार्किक चाहने के समान है ।
रेमी पियरे

1
(पिछली टिप्पणी से जारी)। दूसरा कारण यह है कि एक सत्य है लेकिन कई गैर सत्य; इसलिए, इसके लिए एकमात्र मूल्य trueऔर अन्य सभी मूल्यों को जोड़ना अधिक सुविधाजनक है false। (यह अनिवार्य रूप से कार्यक्रमों के वापसी मूल्यों पर विचार के समान है)।
रेमी पियरे

(पिछली टिप्पणी से जारी)। तीसरा कारण यह है कि "यह सच है कि A" "सत्य कि A" के समान है, "असत्य कि असत्य कि अ" के समान है "असत्य कि अ", आदि; ताकि trueगुणक 1 के falseरूप में और गुणक -1 के रूप में व्यवहार करे । जो, -1 की शक्तियों के रूप में, इसका मतलब है कि true"यहां तक ​​कि" और false"विषम" के रूप में असाधारण व्यवहार करता है । फिर से, यह trueशून्य होने का हकदार है ...
रेमी पियरे

17

एक बुनियादी बात जो मुझे समझ में आती है वह यह है। बैश में और सामान्य रूप से यूनिक्स गोले में, वापसी मूल्य बूलियन नहीं हैं। वे पूर्णांक निकास कोड हैं। इस प्रकार, आपको यह कहना होगा कि सम्मेलन के अनुसार 0 का अर्थ सफलता है, और अन्य मूल्यों का अर्थ कुछ त्रुटि है।

साथ test, [ ]या [[ ]]ऑपरेटरों, बैश की स्थिति 0 के एक बाहर निकलने के कोड (के / bin / सच परिणाम) के मामले में सच के रूप में मूल्यांकन करते हैं। अन्यथा वे असत्य के रूप में मूल्यांकन करते हैं।

बाहर निकलने के कोड की तुलना में स्ट्रिंग्स का मूल्यांकन अलग तरीके से किया जाता है:

if [ 0 ] ; then echo not null ; fi
if [ $(echo 0) ] ; then echo not null ; fi

if [ -z "" ] ; then echo null ; fi

(( ))अंकगणितीय ऑपरेटर सच्चे और झूठे के रूप में व्याख्या 1 और 0। लेकिन उस ऑपरेटर को पूर्ण प्रतिस्थापन के रूप में इस्तेमाल नहीं किया जा सकता है test, [ ]या [[ ]]। यहां एक उदाहरण दिखाया गया है जब अंकगणितीय ऑपरेटर उपयोगी है:

for (( counter = 0 ; counter < 10 ; counter ++ )) ; do
  if (( counter % 2 )) ; then echo "odd number $counter" ; fi
done

सच / झूठ पर ब्रेसिज़ बनाम कोष्ठक के स्पष्टीकरण के लिए धन्यवाद
javadba

15

यह सिर्फ एक कन्वेंशन है कि 0 एग्जिट कोड का मतलब सफलता है। लगभग हर आधुनिक प्रणाली पर EXIT_SUCCESS 0 होगा।

संपादित करें:

"क्यों दोनों परीक्षण 0 और परीक्षण 1 रिटर्न 0 (सफलता)?"

यह बिल्कुल अलग सवाल है। इसका उत्तर यह है कि परीक्षण करने के लिए एक तर्क को पारित करने से हमेशा सफलता मिलती है जब तक कि तर्क शून्य स्ट्रिंग ("") नहीं होता। ओपन ग्रुप डॉक्यूमेंटेशन देखें ।


फिर क्यों दोनों test 0और test 10 (सफलता) लौटाते हैं?
httpinterpret

5
@httpinterpret, testसंख्यात्मक मानों का परीक्षण नहीं करता है। यह जांचता है कि यह स्ट्रिंग नल स्ट्रिंग है या नहीं। man testअधिक जानकारी के लिए।
कार्ल नॉरम

12

आमतौर पर कार्यक्रम सफलता के लिए शून्य, असफलता के लिए गैर-शून्य; false1 लौटाता है क्योंकि यह एक सुविधाजनक गैर-शून्य मान है, लेकिन आम तौर पर किसी भी गैर-शून्य मान का अर्थ किसी प्रकार की विफलता है, और कई कार्यक्रम विभिन्न विफलता मोड को इंगित करने के लिए विभिन्न गैर-शून्य मान लौटाएंगे


2
कोई स्पष्टीकरण (या स्पष्ट कारण) के साथ डाउनवोट्स जो भी चूसते हैं और जो लोग ऐसा करते हैं वे लंगड़े हैं क्योंकि वे समुदाय की बिल्कुल मदद नहीं कर रहे हैं।
अब्दुल्ला जिबली

1
नहीं यह अनदेखी ... लेकिन यह है उनके 2 अंक ... और @MichaelMrozek .. 19.6k के साथ, यह बहुत बुरा चोट नहीं कर सकते हैं, lol।
एलेक्स ग्रे

1
@alexgray यह दो साल पहले था; उस समय मेरे पास लगभग 5k था। और मैं और अधिक उत्सुक था कि प्रतिनिधि के बारे में उत्तर की तुलना में क्या गलत था
माइकल Mrozek

5

AFAIK यह सी कन्वेंशन से आता है कि अगर सक्सेस हो जाए तो आपको 0 वापस कर देना चाहिए। देख:

man close

अधिकांश C (POSIX) एपी इस तरह से निर्मित होते हैं। http://en.wikipedia.org/wiki/C_POSIX_library


4

यह यूनिक्स के शुरुआती दिनों के लिए एक सम्मेलन है।

कन्वेंशन द्वारा, सभी सिस्टम रिटर्न 0 हो जाते हैं यदि सफल, गैर-शून्य अन्यथा, क्योंकि तब विभिन्न संख्याओं का उपयोग विफलता के अलग-अलग कारण को इंगित करने के लिए किया जा सकता है।

गोले इस सम्मेलन का पालन करते हैं, 0 का अर्थ है अंतिम आदेश सफल, गैर-शून्य अन्यथा। इसी तरह, गैर-शून्य रिटर्न मान आउटपुट त्रुटि संदेशों के लिए काम में आता है: उदाहरण के लिए 1: "ब्रेन डेड", 2: "हृदयहीन", और इसी तरह।


यह उत्तर है।
पीटर - मोनिका

3

सफलता / असफलता के साथ सही / झूठ की बराबरी करने की आपकी कोशिश

वे पूरी तरह से दो हैं, हालांकि पहली बार में, अलग-अलग डाइकोटोमिज़ी!

शेल स्क्रिप्टिंग में, सच / झूठ जैसी कोई बात नहीं है। शैल 'भाव' की व्याख्या सही / गलत नहीं है। बल्कि, शेल 'भाव' ऐसी प्रक्रियाएं हैं जो या तो सफल होती हैं या असफल।

जाहिर है, कई कारणों से एक प्रक्रिया विफल हो सकती है। इस प्रकार हमें संभावित विफलताओं को मैप करने के लिए एक बड़े सेट कोड की आवश्यकता है। सकारात्मक पूर्णांक चाल करते हैं। दूसरी ओर, यदि प्रक्रिया सफल होती है, तो इसका मतलब है कि उसने वही किया जो वह करने वाला था। चूंकि ऐसा करने का केवल एक ही तरीका है, हमें केवल एक कोड की आवश्यकता है। 0 टोटका करता है।

सी में, हम एक कार्यक्रम बना रहे हैं। एक शेल स्क्रिप्ट में, हम कुछ करने के लिए कार्यक्रमों का एक गुच्छा चला रहे हैं।

अंतर!


यह भ्रमित करने वाला है। 'आदमी [' टाइप करें। यह दिखाता है कि परीक्षण उपयोगिता अभिव्यक्ति का मूल्यांकन करती है और, यदि यह सत्य का मूल्यांकन करती है, तो शून्य (सच्ची) निकास स्थिति देता है; अन्यथा यह 1 (झूठा) रिटर्न करता है। यदि कोई अभिव्यक्ति नहीं है, तो परीक्षण 1 (गलत) भी देता है।
घुड़सवार

1

शायद यह याद रखने का एक अच्छा तरीका है:

  • रिटर्न कोड जवाब "क्या जवाब है?" सच (या अन्य परिणाम) या गलत
  • बाहर निकलें कोड का जवाब "क्या समस्या है?" बाहर निकलें कोड या कोई समस्या (0)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.