2015-04-18 14 views
8

मैं था एक सा निम्नलिखित व्यवहार को खोजने के लिए परेशान:

bash$ false 
bash$ true | echo $? 
0 
bash$ ksh 
ksh$ false 
ksh$ true | echo $? 
0 
ksh$ zsh 
zsh$ false 
zsh$ true | echo $? 
1 

Intuitively, यह हो जाता है zsh तरह लग रहा है सही है, जबकि पार्टी और ksh गलत हैं। $? 'हाल ही में निष्पादित पाइपलाइन की निकास स्थिति' है, जो प्रत्येक मामले में 1 होना चाहिए। ध्यान दें कि false | echo $?ksh और bash दोनों में 0 प्रिंट करता है। क्या इस बिंदु पर मानक लचीला है (यानी, व्यवहार निर्दिष्ट नहीं है), या bash और ksh यहां गैर-अनुपालनशील हैं? मुझे यह जानकर भी उत्सुकता है कि यह गलत पाने के लिए क्या बाश और क्षीर कर रहे हैं।

$ bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11) 
Copyright (C) 2007 Free Software Foundation, Inc. 
$ zsh --version 
zsh 4.3.11 (i386-apple-darwin11.0) 
$ ksh --version 
    version   sh (AT&T Research) 1993-12-28 s+ 
+2

जब मैंने आपके 'बैश' उदाहरण को चलाया, तो मुझे '1',' 0' नहीं मिला। – lurker

+0

बैश का कौन सा संस्करण? मेरे सिस्टम पर आपके zsh आउटपुट के समान ही उत्पादन करता है। – Mat

+0

कृपया सभी के लिए खोल के संस्करण का उल्लेख करें। मेरे साथ 'zsh' वास्तव में '0' वापस आ गया। इसलिए सत्यापित करने में असमर्थ। –

उत्तर

4

POSIX का कहना है:

$? का सबसे हाल ही [आदेश या] पाइपलाइन दशमलव बाहर निकलें स्थिति पर विस्तृत होता ...

@lurker से टिप्पणी कृपया ध्यान दें। इसके वर्तमान संस्करण 4.3.11 में बैश zsh जैसा व्यवहार करता है।

क्या bash और zsh में होता है $? पाइप से पहले आदेश द्वारा निर्धारित किया जाएगा कि और पाइप के अंदर बदला नहीं मिलता है। यही कारण है कि परिणाम false ->1 से वापसी मूल्य है। और यही वह है जो पॉज़िक्स निर्दिष्ट करता है।

मुझे ksh व्यवहार का वर्णन करने वाले कोई भी दस्तावेज़ नहीं मिल सका। मैं केवल यह मान सकते हैं कि ksh फिर सेट करता है $? पाइप को क्रियान्वित करने, के बाद से निम्नलिखित कोड काम करता है से पहले:

#!/bin/ksh 
false 
ret=$? 
true | echo "$ret" 

शायद यह ksh में एक बग के रूप में दर्ज किया जाना चाहिए। हालांकि, मुझे यकीन नहीं है कि यह व्यवहार POSIX द्वारा बिल्कुल निर्दिष्ट है या नहीं।

+2

हां, इसलिए प्रत्येक मामले में '$?' 'False' द्वारा लौटाई गई स्थिति होनी चाहिए। इसे सबसे हालिया पाइपलाइन का संदर्भ देना चाहिए, और जिस पाइपलाइन का उपयोग किया जा रहा है उसका निर्माण अप्रासंगिक होना चाहिए। –

+0

@ hek2mgl हू? 'Echo' की निकास स्थिति में 'echo $?' में '$?' कैसे हो सकता है? यह 'echo' रन से पहले मूल्यांकन किया जाता है। निश्चित रूप से, * बाद में *, 'echo'' echo' (आमतौर पर शून्य) की निकास स्थिति पर सेट किया जाएगा, लेकिन यह सवाल नहीं है, है ना? – hvd

+0

हाँ, मैं इसे अब देखता हूं। यह 'गूंज' मानने के लिए बेवकूफ था .. – hek2mgl

संबंधित मुद्दे