2011-10-18 42 views
8

(एक समारोह इसकी गूंज प्राप्त करने के लिए कहा जाता है से) मैं इस तरह एक कोड है:निर्यात काम नहीं कर रहा

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    echo "some output" 
} 

final_output="the otput is $(test_this)" 
echo "$ABC" 

दुर्भाग्य से चर ABC सेट नहीं की जा रही है।

मुझे test_this पर कॉल करना है, क्योंकि मेरे असली कार्यक्रम में मैं कुछ तर्क देता हूं, यह विभिन्न जटिल कार्यों को कई अन्य कार्यों को बुलाता है, जिस तरह से यह निर्यात करता है या (उन तर्कों पर आधारित), और अंत में कुछ आउटपुट स्ट्रिंग को वापस करने के लिए इकट्ठा किया जाता है। एक बार निर्यात करने के लिए इसे दो बार कॉल करना और आउटपुट स्ट्रिंग के लिए एक बार खराब होगा।

सवाल यह है कि मैं निर्यात और आउटपुट स्ट्रिंग दोनों जगहों पर रखने के लिए क्या कर सकता हूं, लेकिन केवल एक समारोह के लिए एक कॉल करके?

जवाब है कि मैं के साथ खुश हूँ (धन्यवाद paxdiablo):

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    export A_VERY_OBSCURE_NAME="some output" 
} 

test_this 
final_output="the otput is $A_VERY_OBSCURE_NAME" 
echo "$ABC" #works! 
unset A_VERY_OBSCURE_NAME 

उत्तर

7

हाँ, यह है स्थापित किया जा रहा। दुर्भाग्य से यह उप-प्रक्रिया में सेट किया जा रहा है जो $() द्वारा test_this फ़ंक्शन चलाने के लिए बनाया गया है और इसका मूल प्रक्रिया पर कोई प्रभाव नहीं पड़ता है।

और यह दो बार बुला शायद यह करने के लिए सबसे आसान तरह, की तरह कुछ (एक "गुप्त" पैरामीटर मान का उपयोग कर अगर यह अलग होने की जरूरत है व्यवहार हुक्म करने के लिए) है:

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    if [[ "$1" != "super_sekrit_sauce" ]] ; then 
    echo "some output" 
    fi 
} 

final_output="the output is $(test_this)" 
echo "1:$ABC:$final_output" 
test_this super_sekrit_sauce 
echo "2:$ABC:$final_output" 

जो आउटपुट:

:

1::the output is some output 
2:ABC:the output is some output 

आप वास्तव में केवल एक बार कॉल करना चाहते हैं, तो आप की तरह कुछ कर सकता है

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    export OUTPUT="some output" 
} 

test_this 
final_output="the output is ${OUTPUT}" 
echo "1:$ABC:$final_output" 

दूसरे शब्दों में, आउटपुट निकालने के लिए उसी विधि का उपयोग करें जैसा आपने अन्य जानकारी के लिए किया था।

+0

इस अंतर्दृष्टि के लिए धन्यवाद, लेकिन यह मेरी मदद नहीं करता है। क्या कोई तरीका है कि मैं इस फ़ंक्शन को कॉल या बदल सकता हूं, ताकि मैं वास्तव में बाहर निर्यात प्राप्त कर सकूं? – robert

+1

@robert: अद्यतन देखें। आपकी वास्तविक समस्या यह है कि '$()' जरूरी रूप से एक उपप्रजाय बनाता है ताकि किसी भी पर्यावरण परिवर्तन उस उपप्रजाति तक सीमित रहे। यदि आप इसके बजाय फ़ंक्शन को सीधे कॉल करते हैं, तो आप वर्तमान प्रक्रिया वातावरण को प्रभावित कर सकते हैं। – paxdiablo

+0

धन्यवाद, मैं दूसरे विकल्प के साथ गया, अंत में जोड़ रहा हूं: आउटपुट आउटपुट। – robert

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