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

Я настраиваю сценарий оболочки с menues и sub menues, опциями, и т.д. Но в каждом меню/подменю/и т.д., мне нужно, "Возвращаются к главному меню" выбор.

Я уже разбудил набор меню, и он хорошо работает, но мне нужен способ просто перезапустить сценарий с нуля, сбросить все переменные и т.д. и т.д.

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

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

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

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

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

22
задан 11 October 2013 в 20:01

3 ответа

Да, делайте

exec "$ScriptLoc"

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

0
ответ дан 11 October 2013 в 20:01

Можно использовать что-то вроде этого:

$(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 локальная переменная сценария), затем сценарий никогда не будет останавливаться.

10
ответ дан 11 October 2013 в 20:01

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

0
ответ дан 11 October 2013 в 20:01

Другие вопросы по тегам:

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