POSIX गोले में निम्नलिखित उदाहरण और उनके आउटपुट देखें:
false;echo $?याfalse || echo 1:1false;foo="bar";echo $?याfoo="bar" && echo 0:0foo=$(false);echo $?याfoo=$(false) || echo 1:1foo=$(true);echo $?याfoo=$(true) && echo 0:0
जैसा कि /programming/6834487/what-is-the-variable-in-shell-scripting पर सबसे अधिक वोट किए गए उत्तर द्वारा उल्लेख किया गया है :
$?का उपयोग अंतिम निष्पादित कमांड के रिटर्न मान को खोजने के लिए किया जाता है।
यह शायद इस मामले में थोड़ा भ्रामक है, तो आइए पोसिक्स परिभाषा प्राप्त करें जिसे उस थ्रेड से एक पोस्ट में भी उद्धृत किया गया है:
? सबसे हालिया पाइपलाइन (देखें पाइपलाइन) के दशमलव निकास की स्थिति का विस्तार करता है।
ऐसा प्रतीत होता है जैसे कि एक असाइनमेंट स्वयं एक शून्य निकास मान के साथ एक कमांड (या बल्कि एक पाइपलाइन भाग) के रूप में गिना जाता है, लेकिन जो असाइनमेंट के दाईं ओर से पहले लागू होता है (उदाहरण के लिए मेरे उदाहरण में कमांड प्रतिस्थापन)।
मैं देखता हूं कि यह व्यवहार एक व्यावहारिक दृष्टिकोण से कैसे समझ में आता है, लेकिन यह मुझे कुछ असामान्य लगता है कि असाइनमेंट स्वयं उस क्रम में गिना जाएगा। शायद यह स्पष्ट करने के लिए कि यह मेरे लिए अजीब क्यों है, मान लें कि असाइनमेंट एक फ़ंक्शन था:
ASSIGNMENT( VARIABLE, VALUE )
तब foo="bar"होगा
ASSIGNMENT( "foo", "bar" )
और foo=$(false)ऐसा ही कुछ होगा
ASSIGNMENT( "foo", EXECUTE( "false" ) )
इसका मतलब यह होगा कि यह पहलेEXECUTE चलता है और उसके बाद ही चलता है लेकिन अभी भी यही स्थिति है जो यहां मायने रखती है। ASSIGNMENTEXECUTE
क्या मैं अपने आकलन में सही हूं या मैं कुछ गलत / गलत समझ रहा हूं? क्या मेरे इस व्यवहार को "अजीब" के रूप में देखने के सही कारण हैं?
false;foo="bar";echo $?आखिरी असली कमान जो हमेशा चलती थी वह हमेशा 0 क्योंfalse लौटती है ?" यह मूल रूप से है कि जब कोड से बाहर निकलने की बात आती है तो असाइनमेंट विशेष व्यवहार करते हैं। उनका एग्ज़िट कोड हमेशा 0 होता है, सिवाय इसके कि जब ऐसा कुछ ऐसा नहीं होता है, जो असाइनमेंट के राइट-हैंड साइड के हिस्से के रूप में चलता है।