2012-03-09 7 views
121

छोड़कर जब मैं शेल स्क्रिप्ट में exit कमांड का उपयोग करता हूं, तो स्क्रिप्ट टर्मिनल (प्रॉम्प्ट) को समाप्त कर देगी। क्या स्क्रिप्ट को समाप्त करने और फिर टर्मिनल में रहने का कोई तरीका है?बैश स्क्रिप्ट से बाहर निकलने का कोई भी तरीका, लेकिन टर्मिनल

मेरी लिपि run.sh सीधे सोर्सिंग या किसी अन्य स्क्रिप्ट से सोर्स द्वारा निष्पादित होने की उम्मीद है।

संपादित करें: अधिक विशिष्ट होने के लिए, run2.sh

रूप
... 
. run.sh 
echo "place A" 
... 

और run.sh

... 
exit 
... 

जब मैं यह . run2.sh द्वारा चलाए, के रूप में और अगर यह run.sh में exit codeline मारा दो स्क्रिप्ट देखते हैं , मैं चाहता हूं कि यह टर्मिनल पर रुक जाए और वहां रहे। लेकिन exit का उपयोग करके, पूरा टर्मिनल बंद हो जाता है।

पुनश्च: मैं return उपयोग करने के लिए कोशिश की है, लेकिन echo codeline अभी भी निष्पादित हो जाता होगा ....

+3

मुझे वास्तव में, वास्तव में, वास्तव में पूछना है: आप एक सोर्स लिपि में बाहर निकलने का उपयोग क्यों कर रहे हैं? –

+3

निकास आदेश को आपके टर्मिनल सत्र/लॉगिन को समाप्त नहीं करना चाहिए। यदि आप सफलता के बाद स्क्रिप्ट को समाप्त करने के लिए 'निकास 0' का उपयोग करते हैं, तो जब आप अपनी स्क्रिप्ट को पूर्व में चलाते हैं: '।/test.sh' आपको आउटपुट देखना चाहिए लेकिन आपका कंसोल खुला रहेगा। –

+0

आप 'shell' कमांड का उपयोग कर सकते हैं, जो वास्तव में एक खोल टर्मिनल खुलता है। मेरा खुद का अनुभव यह है कि यह 'बाहर निकलने' के साथ नहीं होता है। सामान्य रूप से बाहर निकलें माता-पिता को नियंत्रण को वापस देता है। –

उत्तर

173

"समस्या" वास्तव में यह है कि आप स्क्रिप्ट कर रहे हैं और स्क्रिप्ट निष्पादित नहीं कर रहे हैं। जब आप किसी फ़ाइल को स्रोत करते हैं, तो इसकी सामग्री को मौजूदा शेल में निष्पादित किया जाएगा, बजाय सबशेल उत्पन्न करने के बजाए। तो बाहर निकलने सहित सबकुछ, मौजूदा खोल को प्रभावित करेगा।

exit का उपयोग करने के बजाय, आप return का उपयोग करना चाहेंगे।

+1

यहां एक और स्पष्टीकरण है कि मुझे मदद मिली: http://askubuntu.com/a/53179/148337 – 3cheesewheel

+0

हालांकि सही है, यह एक अच्छा जवाब नहीं है। यह अनदेखा करता है कि कॉलिंग स्क्रिप्ट चर या फ़ंक्शन घोषित कर सकती है जिसे स्क्रिप्ट कहा जाता है। रिटर्न कोड सेट करने के तरीके को समझाने के लिए बेहतर है और फिर इसे 'run.sh' @ruakh में संसाधित करने के लिए इस प्रश्न का बेहतर उत्तर है। – MikeSchinkel

+3

क्या होगा यदि फ़ंक्शन एक नेस्टेड कॉल है? यानी एक कॉल बी, बी कॉल सी, सी तुरंत बाहर निकलना चाहता है और बी। – Michael

-2

1) बाहर निकलें 0 स्क्रिप्ट से बाहर आ जाएगा अगर यह सफल रहा है।

2) यदि यह विफलता है तो निकास 1 स्क्रिप्ट से बाहर आ जाएगा।

आप इन रिकॉर्ड्स के आधार पर इन उपरोक्त दो को आजमा सकते हैं।

29

हां; आप exit के बजाय return का उपयोग कर सकते हैं। इसका मुख्य उद्देश्य शेल फ़ंक्शन से वापस जाना है, लेकिन यदि आप इसे source -d स्क्रिप्ट के भीतर उपयोग करते हैं, तो वह उस स्क्रिप्ट से वापस आता है।

§4.1 "Bourne Shell Builtins" of the Bash Reference Manual के रूप में कहते हैं:

 return [n] 

कारण एक खोल समारोह वापसी मान n साथ बाहर निकलने के लिए। यदि n की आपूर्ति नहीं की जाती है, तो वापसी मूल्य फ़ंक्शन में निष्पादित अंतिम आदेश की निकास स्थिति है। यह भी समाप्त करने के लिए एक स्क्रिप्ट के निष्पादन . (या source) builtin के साथ निष्पादित जा रहा है, लौटने इस्तेमाल किया जा सकता है या तो n या स्क्रिप्ट के निकास स्थिति के रूप में स्क्रिप्ट के भीतर क्रियान्वित पिछले आदेश के निकास स्थिति । RETURN ट्रैप से जुड़े किसी भी कमांड को फ़ंक्शन या स्क्रिप्ट के बाद निष्पादन फिर से शुरू होने से पहले निष्पादित किया जाता है। वापसी स्थिति स्थिति शून्य है यदि return फ़ंक्शन के बाहर उपयोग किया जाता है और . या source द्वारा स्क्रिप्ट के निष्पादन के दौरान नहीं किया जाता है।

2

ऐसा लगता है जैसे आप अपनी स्क्रिप्ट run2.sh. के अंदर एक रन फ़ंक्शन डालते हैं। आप बैश tty में अपनी run2.sh फ़ाइल को स्रोत करते समय निकास कोड का उपयोग करते हैं। यदि रन को अपनी स्क्रिप्ट से बाहर निकलने के लिए अपनी शक्ति प्रदान करती है और रन 2.sh टर्मिनेटर से बाहर निकलने की शक्ति प्रदान करती है। फिर cuz के रन फ़ंक्शन में आपके टेम्पिनेटर से बाहर निकलने की शक्ति होती है।

#! /bin/sh 
    # use . run2.sh 

    run() 
    { 
     echo "this is run" 
     #return 0 
     exit 0 
    } 

    echo "this is begin" 
    run 
    echo "this is end" 

वैसे भी, मैं कज़ के साथ स्वीकृति देता हूं कि यह एक डिज़ाइन समस्या है।

0

अपने टर्मिनल एमुलेटर नहीं है, तो आप एक -hold sourced स्क्रिप्ट स्वच्छ और साथ टर्मिनल पकड़ कर सकते हैं:

#!/bin/sh 
sed "s/exit/return/g" script >/tmp/script 
. /tmp/script 
read 

अन्यथा आप उपयोग कर सकते हैं $TERM -hold -e script

2

मुझे लगता है कि ऐसा होता है क्योंकि आप चल रहे हैं यह डॉट के साथ स्रोत मोड पर

. myscript.sh 

आप चलाना चाहिए कि एक subshell में:

/full/path/to/script/myscript.sh 

'स्रोत' http://ss64.com/bash/source.html

+0

पर समाप्त करना चाहता है तो 'sh

9
इसके बजाय आप स्क्रिप्ट तो यह स्क्रिप्ट अन्य खोल खोला छोड़ने के अंत में बंद कर दिया जाएगा चलाने के लिए sh run2.sh या bash run2.sh
एक नया उदाहरण खोला जाएगा का उपयोग कर स्क्रिप्ट चला सकते हैं . run2.sh का उपयोग कर कोड चलाने का

। `

+0

यदि हां, तो दूसरा पैरामीटर 'sh" क्यों है। " run2.sh'? – H0WARD

+0

@ H0WARD आप सही हैं मैं डॉट्स को हटाने के लिए भूल गया। मैंने अभी जवाब संपादित किया है। –

+0

ओपी स्पष्ट रूप से एक आवश्यकता के रूप में स्रोत बताता है। –

0

यह सही है कि सोर्स किए गए बनाम निष्पादित स्क्रिप्ट return बनाम exit का उपयोग उसी सत्र को खोलने के लिए करते हैं, जैसा कि अन्य ने नोट किया है।

यहां एक संबंधित टिप है, यदि आप कभी भी एक स्क्रिप्ट चाहते हैं जो सत्र को खोलना चाहिए, चाहे वह सोर्स हो या नहीं।

निम्नलिखित उदाहरण सीधे foo.sh जैसे चलाया जा सकता है या . foo.sh/source foo.sh जैसे सोर्स किया जा सकता है। किसी भी तरह से यह "बाहर निकलने" के बाद सत्र को खुला रखेगा। [email protected] स्ट्रिंग पास हो गई है ताकि फ़ंक्शन को बाहरी स्क्रिप्ट के तर्कों तक पहुंच हो।

#!/bin/sh 
foo(){ 
    read -p "Would you like to XYZ? (Y/N): " response; 
    [ $response != 'y' ] && return 1; 
    echo "XYZ complete (args [email protected])."; 
    return 0; 
    echo "This line will never execute."; 
} 
foo "[email protected]"; 

टर्मिनल परिणाम:

$ foo.sh
XYZ करने देना चाहेंगे $ आप? (वाई/एन): एन
$। foo.sh
$ क्या आप XYZ करना चाहते हैं?(वाई/एन): एन
$ |
(टर्मिनल विंडो खुला रहता है और अतिरिक्त इनपुट स्वीकार करता है)

यह जल्दी से एक टर्मिनल में स्क्रिप्ट परिवर्तन का परीक्षण करते हुए नीचे मुख्य exit/return स्क्रैप कोड का एक समूह रखते हुए आपको अपने काम के लिए उपयोगी हो सकता है। यह कोड को एक अर्थ में अधिक पोर्टेबल भी बना सकता है (यदि आपके पास कई स्क्रिप्ट हैं जो अलग-अलग तरीकों से बुलाई जा सकती हैं या नहीं भी हो सकती हैं), हालांकि यह return और exit का उपयोग करने के लिए बहुत कम है।

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