स्क्रिप्ट को स्क्रिप्ट के अंदर से पूरी तरह से रिस्टार्ट कैसे करें


22

मैं मेन्यू और सब मेन्यू, विकल्प आदि के साथ एक शेल स्क्रिप्ट की स्थापना कर रहा हूं, लेकिन प्रत्येक मेनू / सबमेनू / आदि पर, मुझे "मेन मेनू पर वापस जाएं" विकल्प की आवश्यकता है।

मुझे पहले ही मेनू सेट हो गया है और यह ठीक काम करता है, लेकिन मुझे स्क्रैच से स्क्रिप्ट को पुनरारंभ करने, सभी चर आदि को रीसेट करने आदि के लिए एक तरीका चाहिए।

या वर्तमान स्क्रिप्ट से बाहर निकलने और इसे फिर से शुरू करने का एक तरीका है।

मैंने ऐसा करने की कोशिश की है:

ScriptLoc=$(readlink -f "$0")
./ScriptLoc

लेकिन यह "पुरानी" स्क्रिप्ट के अंदर "नई" स्क्रिप्ट शुरू करता है, इसलिए जब मैं "नई" स्क्रिप्ट से बाहर निकलता हूं, तो यह "पुरानी" स्क्रिप्ट (यदि यह किसी भी अर्थ में है) पर वापस चला जाता है। यह स्क्रिप्ट की तरह की एक स्क्रिप्ट है।

किसी को भी एक विचार है कि इसे पूरी तरह से कैसे पुनः आरंभ करें?


यह $ScriptLocकिसी भी तरह होना चाहिए : ./ScriptLocवर्तमान निर्देशिका में उस नाम की एक स्क्रिप्ट की तलाश करता है।
पूली

जवाबों:



10

आप कुछ इस तरह का उपयोग कर सकते हैं:

$(basename $0) && exit

$(basename $0)वर्तमान स्क्रिप्ट की एक नई आवृत्ति बनाएगा और स्क्रिप्ट exitकी वक्र आवृत्ति से बाहर निकलेगा।

यहाँ एक परीक्षण स्क्रिप्ट है जो उपरोक्त विधि पर प्रकाश डालती है:

#!/bin/bash

if ! [[ $count =~ ^[0-9]+$ ]] ; then
    export count=0
fi

echo $count

if [ $count -le 10 ]; then
    count=$(echo "$count+1" | bc)   
    ./$(basename $0) && exit #this will run if started from the same folder
fi

echo "This will be printed only when the tenth instance of script is reached"

यदि आप उपयोग नहीं करते हैं export count=0(जो countएक पर्यावरण चर बनाते हैं ) और केवल count=0(जो contएक स्थानीय स्क्रिप्ट चर बनाते हैं ) का उपयोग करें , तो स्क्रिप्ट कभी भी बंद नहीं होगी।


&& exitस्क्रिप्ट से सफल होने पर ही बाहर निकलेंगे। इसलिए यदि उदाहरण के लिए स्क्रिप्ट निष्पादन योग्य नहीं है या इसमें सिंटैक्स त्रुटि है, तो यह केवल स्पिन करने की संभावना है।
पूली

जोड़ा गया ।/ बेसन के लिए - अन्यथा एक सुंदर समाधान - वास्तव में अच्छा, एक +1 को हराया।
लेफ्टी जी बालोग

4

विश्वसनीय रूप से उस स्क्रिप्ट को प्राप्त करना जो वर्तमान में निष्पादित हो रहा है, जितना आप सोच सकते हैं उतना कठिन है। Http://mywiki.wooledge.org/BashFAQ/028 देखें ।

इसके बजाय, आप ऐसा कुछ कर सकते हैं:

main_menu() { 
    printf '1. Do something cool\n'
    printf '2. Do something awesome\n'
    : ... etc
}

some_sub_sub_menu() {
    ...
    printf 'X. Return to main menu\n'
    ...
    if [[ $choice = [Xx] ]]; then
        exit 255
    fi
}

while true; do
    (main_menu)
    res=$?
    if (( res != 255 )); then
        break
    fi
done

मूल रूप से, आप मुख्य_मेनू फ़ंक्शन को एक सबशेल में चलाते हैं, इसलिए यदि आप मेन_मेनू, या किसी भी उप मेनू से बाहर निकलते हैं, तो आप सबशेल से बाहर निकलते हैं, मुख्य शेल नहीं। निकास स्थिति 255 को "फिर से जाओ" का अर्थ करने के लिए यहां चुना गया है। किसी भी अन्य बाहर निकलने की स्थिति अन्यथा अनंत लूप से बाहर निकल जाएगी।

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