Komut dosyasını komut dosyasının içinden tamamen yeniden başlatma


22

Menues ve alt menues, seçenekleri, vb. İle bir kabuk komut dosyası ayarlıyorum. Ama her menü / alt menü / vb, ben bir "Ana menüye geri dön" seçim gerekir.

Zaten menü ayarladım ve iyi çalışıyor, ama sadece komut dosyasını sıfırdan yeniden başlatmak, tüm değişkenleri sıfırlamak vb.

Veya geçerli komut dosyasından çıkıp yeniden başlatmanın bir yolu.

Bunu yapmaya çalıştım:

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

Ancak bu, "eski" komut dosyasının içindeki "yeni" komut dosyasını başlatır, bu nedenle "yeni" komut dosyasından çıktığınızda, "eski" komut dosyasına geri döner (bu bir anlam ifade ediyorsa). Senaryo türünde bir senaryo.

Herkes nasıl tamamen yeniden başlatmak için bir fikir var mı?


Her $ScriptLocneyse ./ScriptLoc, şu anki dizinde bu adın bir komut dosyasını arar.
poolie

Yanıtlar:



10

Bunun gibi bir şey kullanabilirsiniz:

$(basename $0) && exit

$(basename $0)geçerli komut dosyasının yeni bir örneğini oluşturur ve komut dosyasının geçerli örneğinden exitçıkar.

Yukarıdaki yöntemi vurgulayan bir test komut dosyası:

#!/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"

Eğer kullanmıyorsanız export count=0(yapmak hangi countbir ortam değişkeni olarak) ve sadece kullanmak count=0(yapmak hangi contbir yerel komut değişkeni), sonra komut durdurma asla.


&& exityalnızca komut dosyası başarılı olursa çıkar. Örneğin, komut dosyası yürütülebilir değilse veya bir sözdizimi hatası varsa, bu muhtemelen dönecektir.
poolie

Taban adına ./ eklendi - aksi takdirde güzel bir çözüm - gerçekten güzel, def +1.
Lefty G Balogh

4

Yürütülmekte olan komut dosyasını güvenilir bir şekilde elde etmek düşündüğünüzden daha zordur. Bkz. Http://mywiki.wooledge.org/BashFAQ/028 .

Bunun yerine, böyle bir şey yapabilirsiniz:

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

Temel olarak, main_menu işlevini bir alt kabukta çalıştırırsınız, bu nedenle main_menu veya alt menülerden çıkarsanız ana kabuktan değil alt kabuktan çıkarsınız. çıkış durumu 255 burada "tekrar git" anlamına gelir. Diğer tüm çıkış durumları, aksi takdirde sonsuz döngüden çıkar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.