2010-12-12 10 views
34

यह बैश काम करता है स्निपेट के रूप में मैं उम्मीद कर लिया जाएगा:"स्थानीय" कमांड का रिटर्न कोड क्यों देता है?

$ fun1() { x=$(false); echo "exit code: $?"; } 
$ fun1 
exit code: 1 

लेकिन इस एक, local का उपयोग कर, नहीं करता है:

$ fun2() { local x=$(false); echo "exit code: $?"; } 
$ fun2 
exit code: 0 

किसी को भी व्याख्या कर सकते हैं क्यों local आदेश की वापसी कोड स्वीप करता है ?

+1

https://lists.gnu.org/archive/html/bug-bash/2010-03/msg00007.html – tokland

उत्तर

41

local रिटर्न 0 के साथ कोड 0 कारण है क्योंकि $? "हाल ही में निष्पादित अग्रभूमि पाइपलाइन के बाहर निकलने की स्थिति में विस्तार करता है।" इस प्रकार $?local

की सफलता लौटा रहा है तुम इतनी तरह x के प्रारंभ से x की घोषणा को अलग करके इस व्यवहार को ठीक कर सकते हैं:

$ fun() { local x; x=$(false); echo "exit code: $?"; }; fun 
exit code: 1 
+0

मैं आमतौर पर एक पंक्ति में एक चर को परिभाषित और उपयोग करना पसंद करता हूं, लेकिन हाँ यह एक है स्वीकार्य कामकाज। – tokland

+4

रिकॉर्ड के लिए, बैशपिटफॉल विकी में समस्या पर चर्चा की गई है: http://mywiki.wooledge.org/BashPitfalls#local_varname.3D.24.28command.29 – tokland

+0

मैंने सोचा कि मैं पागल हो रहा था ... धन्यवाद! – peteroak

2

local आदेश की वापसी कोड की वापसी कोड को धुंधला false

+1

हाँ, मैं इसे समझता हूं, लेकिन स्थानीय एक विशेष कीवर्ड होने के नाते मैं इसे अस्पष्ट नहीं होने की उम्मीद करता हूं। मुझे लगता है कि यह एक झूठी धारणा थी। – tokland

+3

यह एक "विशेष कीवर्ड" नहीं है, यह एक खोल बनाया गया है। यहां तक ​​कि बिल्टिन के पास मूल्य भी हैं। –

+0

धन्यवाद @ इग्नासिओ, आप सही हैं, मुझे "स्थानीय VAR = $ (कमांड) के गलत उपयोगों के लिए मेरी स्क्रिप्ट जांचनी होगी || वापसी 1" – tokland

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