স্ক্রিপ্টের ভিতরে থেকে সম্পূর্ণ স্ক্রিপ্টটি পুনরায় আরম্ভ করবেন কীভাবে


22

আমি মেনু এবং সাব মেনু, অপশন ইত্যাদি দিয়ে একটি শেল স্ক্রিপ্ট স্থাপন করছি তবে প্রতিটি মেনুতে / সাবমেনু / ইত্যাদিতে আমার "প্রধান মেনুতে ফিরে যান" পছন্দ প্রয়োজন।

আমি ইতিমধ্যে মেনু সেট আপ পেয়েছি এবং এটি সূক্ষ্মভাবে কাজ করে, তবে স্ক্র্যাচ থেকে কেবল স্ক্রিপ্টটি পুনরায় চালু করার জন্য, সমস্ত ভেরিয়েবলগুলি পুনরায় সেট করা ইত্যাদি আমার প্রয়োজন way

বা বর্তমান স্ক্রিপ্ট থেকে প্রস্থান করে আবার শুরু করার উপায়।

আমি এটি করার চেষ্টা করেছি:

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 বেছে নেওয়া হয়েছে। অন্য কোনও প্রস্থান স্থিতি অন্যথায় অসীম লুপটি ভেঙে যাবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.