बैश फ़ंक्शन से बाहर निकलें, टर्मिनल नहीं


12

मेरे पास एक बैश स्क्रिप्ट है, जिसके नीचे ज़ुकीपर स्थापित है, लेकिन केवल अगर पहले से स्थापित नहीं है।

##zookeper
installZook(){

        ZOOK_VERSION="3.4.5"
        ZOOK_TOOL="zookeeper-${ZOOK_VERSION}"
        ZOOK_DOWNLOAD_URL="http://www.us.apache.org/dist/zookeeper/${ZOOK_TOOL}/${ZOOK_TOOL}.tar.gz"

        if [ -e $DEFAULT_INSTALLATION_DEST/${ZOOK_TOOL} ]; then
                echo "${ZOOK_TOOL} alreay installed";
                exit 1;      # <<<< here
        elif [ ! -e $DEFAULT_SOURCE_ROOT/${ZOOK_TOOL}.tar.gz ]; then
                wgetIt $ZOOK_DOWNLOAD_URL
        else
                echo "[info] : $DEFAULT_SOURCE_ROOT/$ZOOK_TOOL already exists"
        fi

        sudo mkdir -p /var/lib/zookeeper
        sudo mkdir -p /var/log/zookeeper

        tarIt "$DEFAULT_SOURCE_ROOT/$ZOOK_TOOL.tar.gz"
        sudo chmod 777 -R $DEFAULT_INSTALLATION_DEST/$ZOOK_TOOL
        cp $DEFAULT_INSTALLATION_DEST/$ZOOK_TOOL/conf/zoo_sample.cfg $DEFAULT_INSTALLATION_DEST/$ZOOK_TOOL/conf/zoo.cfg
cat >> ~/.bash_profile <<'EOF'

  ###############################
  ########### ZOOK ###############
  ###############################
  ZOOK_HOME=/usr/local/zookeper-3.4.5
  export ZOOK_HOME
  export PATH=$PATH:$ZOOK_HOME/bin

EOF
}

चिह्नित लाइन पर <<<< here, अगर ज़ुकीपर पहले से स्थापित है, तो मैं चाहता हूं कि इसके नीचे की स्क्रिप्ट से बाहर निकलना है। लेकिन exitटर्मिनल का उपयोग करके ही बाहर निकलता है।


1
आप इस स्क्रिप्ट को कैसे लॉन्च करेंगे?
बेनोइट

2
return 1इसके बजाय का उपयोग करेंexit 1
polym

जवाबों:


21

टी एल; डॉ

के returnबजाय का उपयोग करें exitऔर source your-script.shउर्फ के साथ अपनी स्क्रिप्ट चलाएँ ।. your-script.sh

पूरा ब्योरा

यदि इसमें एक exitबयान के साथ एक स्क्रिप्ट लॉन्च करना है, तो आपको इसे वर्तमान बच्चे के बच्चे के रूप में लॉन्च करना होगा।

यदि आप इसे अपने टर्मिनल सत्र के साथ शुरू किए गए वर्तमान शेल के अंदर लॉन्च करते हैं ( . ./<scriptname>किसी भी exitमुख्य शेल को बंद कर देंगे, तो आपके टर्मिनल सत्र के साथ शुरू हुआ।

यदि आपने अपनी स्क्रिप्ट लॉन्च की थी bash ./<scriptname>(या बैश के बजाय कोई अन्य शेल ), तो exitआपके बच्चे के शेल को बंद कर दिया होता , न कि आपके टर्मिनल के लिए उपयोग किया जाने वाला।

यदि आपकी स्क्रिप्ट में निष्पादन योग्य अनुमतियां हैं, तो शेल का नाम दिए बिना इसे सीधे निष्पादित करना बच्चे के शेल में भी निष्पादित करेगा।

का उपयोग returnकरने के बजाय exitआप अभी भी उपयोग कर अपने स्क्रिप्ट शुरू करने के लिए अनुमति देगा . ./<script name>वर्तमान खोल बंद किए बिना। लेकिन आपको returnकेवल एक फ़ंक्शन या एक स्रोत से बाहर निकलने के लिए उपयोग करने की आवश्यकता है (स्क्रिप्ट . ./<scriptname>सिंटैक्स का उपयोग करके भाग गया )।


returnस्क्रिप्ट फ़ाइल को रोकना नहीं होगा
नाम जी VU

@NamGVU बाहर निकलने के बजाय लौटना सही काम है। यह मानते हुए कि वे फ़ाइल को स्रोत बनाते हैं और फिर फ़ंक्शन को कॉल करते हैं ( दिए गए फ़ाइल को सोर्स करते समय फ़ंक्शन को exit/ returnमें नहीं बुलाया जाएगा), शेल सत्र समाप्त हो जाएगा (टर्मिनल के साथ) यदि फ़ंक्शन का उपयोग किया जाता है exit। इसके साथ return, यह कॉलिंग शेल पर नियंत्रण को नियंत्रित करेगा। ध्यान दें कि यदि आप एक खट्टा स्क्रिप्ट (जो इस बारे में नहीं है) से वापस लौटना चाहते हैं, returnतो यह सही तरीका है कि exitवह शेल सत्र को भी समाप्त कर दे।
Kusalananda

यह इस बात पर निर्भर करता है कि आप स्क्रिप्ट को पहले स्थान पर कैसे चलाते हैं
Nam G VU

@NamGVU फ़ाइल में फ़ंक्शन के लिए कोई कॉल नहीं है। केवल सोर्सिंग या फ़ाइल चलाने से फ़ंक्शन को कॉल नहीं किया जाएगा। बताएं कि फ़ंक्शन फ़ाइल को पहले सोर्स करने और फिर टर्मिनल में कॉल करने के अलावा शेल सत्र और टर्मिनल को किसी अन्य तरीके से कैसे समाप्त करता है।
Kusalananda

साझा करने के लिए धन्यवाद। मुझे लगता है कि हम उस विषय से बहुत दूर नहीं जा रहे हैं।
नाम जी VU

1

एकमात्र तरीका जो दी गई स्क्रिप्ट शेल सत्र (और इसलिए टर्मिनल) को समाप्त करने में सक्षम है, आप स्क्रिप्ट सोर्सिंग ( installZookवर्तमान शेल सत्र में फ़ंक्शन को स्थापित करने के लिए ), और फिर शेल में फ़ंक्शन चला रहे हैं।

यदि आप जो दिखा रहे हैं installZook, वह फ़ंक्शन को कॉल करने वाली एक बड़ी स्क्रिप्ट का केवल एक हिस्सा है , तो फ़ंक्शन अभी भी केवल टर्मिनल को समाप्त करने का कारण बन सकता है यदि स्क्रिप्ट को सॉर्ट किया गया है , लेकिन साधारण शेल स्क्रिप्ट के रूप में चलाने के माध्यम से नहीं।

exitवर्तमान शेल सत्र समाप्त करता है। जब फ़ंक्शन निष्पादित exitहोता है तो इसे शेल कहा जाता है जो इसे कहते हैं।

returnएक समारोह (या एक स्क्रिप्ट स्क्रिप्ट से वापसी)। समारोह के बजाय तो exit, इस्तेमाल किया return, यह बाहर निकले बिना बुला पर्यावरण (शायद इंटरैक्टिव खोल है कि आप से समारोह कहा जाता है) के लिए नियंत्रण लौट आते हैं।

यदि आप मैन्युअल रूप से installZookफ़ंक्शन को शेल से चलाते हैं , तो आपको इसे बदलने की आवश्यकता exitहै return। यदि आपकी स्क्रिप्ट में कोड का एक और टुकड़ा है जो फ़ंक्शन को कॉल करता है (और जिसे आप नहीं दिखा रहे हैं), तो कोड के उस टुकड़े को फ़ंक्शन की वापसी स्थिति के अतिरिक्त प्रतिक्रिया करने की आवश्यकता है ।

उदाहरण के लिए

installZook || return

यदि यह स्क्रिप्ट में किसी फ़ंक्शन का हिस्सा नहीं था, और यदि आपने स्क्रिप्ट को सॉरी किया है, तो यह फ़ंक्शन को एक शून्य-शून्य निकास कोड वापस करने पर शेल पर नियंत्रण लौटाएगा।


0

उपयोग exit 1करने के बजाय प्रयोग करके देखें return 1


1
returnInstallZook()फ़ंक्शन से वापस आएगा , स्क्रिप्ट से बाहर नहीं।
बमर

@ बरमार ऊपर टिप्पणी देखें ।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.