2012-10-11 10 views
7

मुझे मेरे लिए अजीब व्यवहार मिला है, जिसे मैं समझा नहीं सकता।सबहेल से आउटपुट और आउटपुट से स्थानीय चर

function prepare-archive { 
blah-blah-blah... 
_SPEC_FILE=$(check-spec-file "$_GIT_DIR/packaging/") 
exit $? 
blah-blah-blah... 
} 

का मतलब है मैं मूल्य जो मैं उम्मीद मिलती है:: के रूप में मैं चर को local परिभाषा जोड़ने जैसे ही

bash -x ./this-script.sh: 
++ exit 1 
+ _SPEC_FILE='/home/likern/Print/Oleg/print-service/packaging/print-service.spec 
/home/likern/Print/Oleg/print-service/packaging/print-service2.spec' 
+ exit 1 

:

local _SPEC_FILE=$(check-spec-file "$_GIT_DIR/packaging/") 

मैं निम्नलिखित मिल निम्नलिखित कोड काम ठीक है :

bash -x ./this-script.sh: 
++ exit 1 
+ local '_SPEC_FILE=/home/likern/Print/Oleg/print-service/packaging/print-service.spec 
/home/likern/Print/Oleg/print-service/packaging/print-service2.spec' 
+ exit 0 
$:~/MyScripts$ echo $? 
0 

प्रश्न: क्यों? क्या हुआ है? क्या मैं सबहेल से आउटपुट को local वैरिएबल पर पकड़ सकता हूं और सबहेल के रिटर्न वैल्यू को विश्वसनीय रूप से देख सकता हूं?

पीएस: prepare-archive मुख्य खोल स्क्रिप्ट में कहा जाता है। exitcheck-spec-file फ़ंक्शन से prepare-archive फ़ंक्शन से दूसरा है - यह फ़ंक्शन स्वयं मुख्य शेल स्क्रिप्ट से निष्पादित किया गया है। मैं check-spec-file से exit 1 पर मान वापस लौटाता हूं, फिर यह मान exit $? पर पास करता है। इस प्रकार मैं उम्मीद करता हूं कि वे वही होना चाहिए।

+0

किस संदर्भ में 'तैयार-संग्रह' कहा जाता है? '++ निकास 1' आपके द्वारा दिखाए गए किसी भी कोड से फिट नहीं है। – chepner

उत्तर

4

बैश पुस्तिका से, Shell Builtin Commands अनुभाग:

local: 
    [...]The return status is zero unless local is used outside a function, an invalid name is supplied, or name is a readonly variable. 

आशा इस = मदद करता है)

+0

क्या इसका मतलब यह है कि 'स्थानीय' के बिना उपयोग किए जाने पर परिवर्तनीय परिभाषा में वापसी की स्थिति नहीं है? क्यूं कर? क्या आप कुछ कामकाज जानते हैं - क्योंकि मैं अनावश्यक वैश्विक चर का उत्पादन नहीं करना चाहता हूं। –

+0

मुझे किसी भी वर्कअराउंड से अवगत नहीं है जिसमें वैश्विक चर या निर्माण के उपयोग शामिल नहीं हैं, क्षमा करें = (। मैं 'स्थानीय TMPFILE = $ (mktemp) करूँगा; चेक-स्पेक-फ़ाइल> $ TMPFILE ; स्थानीय त्रुटि = $?; स्थानीय _SPEC_FILE = $ (बिल्ली $ TMPFILE); आरएम $ TMPFILE' –

+1

@Mephi_stofel - इसके आसपास काम करने के लिए, आप घोषणा और प्रारंभिक विभाजन को विभाजित कर सकते हैं, उदाहरण के लिए पहले यह: 'local my_var' और उससे भी अधिक: 'my_var = $ (my_function)' प्रारंभिकता स्थानीय चर को प्रदूषित किए बिना स्थानीय चर का सुरक्षित रूप से संदर्भित करेगी। –

12

subshell के जाने के स्थिति पर कब्जा करने के लिए, काम से पहले स्थानीय रूप में चर घोषित, उदाहरण के लिए, निम्न स्क्रिप्ट

#!/bin/sh 

local_test() 
{ 
    local local_var 
    local_var=$(echo "hello from subshell"; exit 1) 
    echo "subshell exited with $?" 
    echo "local_var=$local_var" 
} 

echo "before invocation local_var=$local_var in global scope" 
local_test 
echo "after invocation local_var=$local_var in global scope" 

निम्नलिखित उत्पादन का उत्पादन

before invocation local_var= in global scope 
subshell exited with 1 
local_var=hello from subshell 
after invocation local_var= in global scope 
+0

क्या आप दिमाग बता रहा है कि यहाँ क्या हो रहा है? आपके उत्तर ने मेरी समस्या तय की है, लेकिन मुझे अभी भी समझ में नहीं आता कि यह कैसे और क्यों ऐसा करता है। –

+1

@IhorKaharlichenko यदि एक चर को 'स्थानीय' के साथ घोषणा पर सौंपा गया है, तो उप-खोल निकास स्थिति "मुखौटा" है बाहर निकलने के द्वारा/overriden 'लोकल' अंतर्निहित कमांड का टैटस। असाइनमेंट से पहले एक स्थानीय चर घोषित करना भी अधिक पोर्टेबल है (कुछ गोले 'स्थानीय' के साथ प्रारंभिक समर्थन का समर्थन नहीं करते हैं)। – vilpan

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