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

В настоящее время у меня нет Ubuntu на ноутбуке, но я считаю, что он должен быть в: Системные настройки> Питание, у вас должна быть возможность выбрать, что делать, когда крышка закрыта.

1
задан 11 October 2013 в 21:01

2 ответа

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

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

5
ответ дан 24 May 2018 в 16:58
  • 1
    && exit выйдет, только если сценарий завершится успешно. Так что, если, например, сценарий не является исполняемым или имеет синтаксическую ошибку, это, скорее всего, просто запустится. – poolie 16 October 2013 в 05:48
  • 2
    Добавлено ./ в basename - в противном случае красивое решение - действительно приятно, def a +1. – Lefty G Balogh 7 March 2017 в 14:59

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

3
ответ дан 24 May 2018 в 16:58

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

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