2010-12-08 6 views
5

मैं निम्न के समान एक bash स्क्रिप्ट है: परीक्षण समारोह एक उप खोल में चलाया जाता हैएक माता पिता के खोल और बच्चे के बीच एक ही पार्टी चर का उपयोग कैसे करें शैल


function test 
{ 
    running=$(($running - 1)) 
} 

running=0 
test & 
echo $running 

 

क्योंकि यह प्रभावित नहीं करता है चल रहे चर और मुझे स्क्रीन पर प्रतिबिंबित 0 मिलता है। माता-पिता के गोले चर बदलने में सक्षम होने के लिए मुझे उप खोल की आवश्यकता है, यह कैसे किया जा सकता है? मैंने निर्यात करने की कोशिश की है लेकिन इसका कोई फायदा नहीं हुआ है।

संपादित करें सभी सहायक उत्तरों के लिए धन्यवाद, कारण मैं पृष्ठभूमि में इस फ़ंक्शन को चलाने का कारण एक साथ कई कार्यों को चलाने की अनुमति देना है। जब सभी कार्यों को समाप्त कर दिया जाता है तो मुझे यह बताने के लिए अभिभावक स्क्रिप्ट पर वापस कॉल करने में सक्षम होना चाहिए। मैं ऐसा करने के लिए पिड्स का उपयोग कर रहा था लेकिन मुझे यह जांचना पसंद नहीं है कि लूप में कई प्रक्रियाएं लगातार जीवित हैं या नहीं।

+3

आम तौर पर यह नहीं किया जा सकता है। आप सबहेल में फ़ंक्शन क्यों चला रहे हैं? और पृष्ठभूमि में? यदि आप हमें बताते हैं कि आप क्या करने की कोशिश कर रहे हैं तो हम आपकी मदद करने में सक्षम होंगे। – thkala

+0

दरअसल, आप "डाउन" निर्यात करते हैं, लेकिन "ऊपर" नहीं। इस मामले में '& 'को हटाने में मदद मिलेगी, लेकिन मुझे विश्वास है कि आपको इसे पृष्ठभूमि में चलाने की ज़रूरत है, अगर इसे रखा जाए। – khachik

+0

'((चल रहा है))' या '((--running))' –

उत्तर

2

आप वास्तव में नहीं कर सकते हैं। प्रत्येक खोल में पर्यावरण की एक प्रति है।

Can a shell script set environment variables of the calling shell?

देख लेकिन आप अपने उदाहरण में क्या कर रहे हैं के लिए, अपनी स्क्रिप्ट के रूप में इस प्रयास करें:

 
#!/bin/bash 

function testSO 
{  
    running=$(($running - 1)); 
    return $running; 
} 

और के रूप में यह आह्वान:

 
running=$(testSO) 

आप केवल चाहते हैं करने के लिए प्रभावशाली ढंग से एक मूल्य वापस करें, फिर केवल समारोह से मूल्य वापस करें।

+0

यह अग्रभूमि में 'testSO' चलाने के समान है, लेकिन यह ओपी चाहता है, मुझे लगता है। – khachik

+2

आप किसी फ़ंक्शन से "वापसी" जानकारी के दो अलग-अलग तरीकों को भ्रमित कर रहे हैं: इसे एक स्थिति के रूप में लौटाना (क्या 'वापसी' करता है), और इसे stdout (जो '' (...) 'कैप्चर करता है) पर भेज रहा है। आपको या तो 'echo $ running' और' running = $ (testSO) 'या' वापसी $ चलाना 'और' testSO 'का उपयोग करने की आवश्यकता है; दौड़ = $? 'दोनों का मिश्रण नहीं। चूंकि 'रनिंग' स्थिति संकेतक प्रतीत नहीं होता है (यानी nonzero कोई त्रुटि इंगित नहीं करता है), मैं पहले दृष्टिकोण के साथ जाऊंगा। –

+0

स्पष्टीकरण के लिए धन्यवाद। मैं subshells के साथ एक विज़ नहीं हूँ, इसलिए मैं और अधिक सीखने की सराहना करता हूं। –

0

कार्यों के बजाय उपनाम का उपयोग करें। या फ़ंक्शन बॉडी के साथ एक स्क्रिप्ट लिखें और इसे source के साथ निष्पादित करें।

दोनों समाधान उप-खोल बनाने से बचते हैं।

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

  • कोई संबंधित समस्या नहीं^_^