Как полностью перезапустить скрипт изнутри самого скрипта

Я устанавливаю сценарий оболочки с меню и подменю, параметрами и т. Д. Но в каждом меню / подменю / и т. Д. Мне нужно выбрать «Вернуться в главное меню».

У меня уже есть настроенное меню, и оно работает нормально, но мне нужен способ, чтобы просто перезапустить скрипт с нуля, сбросить все переменные и т. Д. И т. Д.

Или способ выйти из текущего сценария и запустить его снова.

Я пытался сделать это:

ScriptLoc=$(readlink -f "[110]")
./ScriptLoc

Но это запускает «новый» скрипт внутри «старого» скрипта, поэтому, когда я выхожу из «нового» скрипта, он возвращается к «старый» скрипт (если это имеет смысл). Это сценарий внутри сценария.

Кто-нибудь получил идею, как его полностью перезапустить?

20
задан 15.04.2020, 07:29

3 ответа

Да, делайте

exec "$ScriptLoc"

Встроенная команда exec заменяет текущую программу новой.

21
ответ дан 15.04.2020, 07:30

Вы можете использовать что-то вроде этого:

$(basename [110]) && exit

$(basename [112]) создаст новый экземпляр текущего скрипта и 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 [111]) && 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 локальной переменной скрипта), тогда скрипт никогда не остановится.

9
ответ дан 15.04.2020, 07:30

Надежно получить сценарий, который в данный момент выполняется, сложнее, чем вы думаете. См. 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

По сути, вы запускаете функцию main_menu в подоболочке, поэтому если вы выходите из main_menu или из любого из подменю, вы выходите из подоболочка, а не основная оболочка. статус выхода 255 выбран здесь, чтобы означать «идти снова». Любое другое состояние выхода выйдет из бесконечного цикла.

4
ответ дан 15.04.2020, 07:31

Теги

Похожие вопросы