Будет ли работать данный метод запуска скрипта do.sh с последующей командой exit 0;
Мне на данном этапе необходимо завершить работу скрипта в секции создания пользователя, а затем запустить новый экземпляр выполнения этого скрипта, а старый завершить..
Судя по скрипту, делать нужно иначе.
В этой реализации новый скрипт - дочерний к родительскому, а родительский, по требованиям, нужно завершить при запуске дочернего. При завершении родительского автоматом завершаются все дочерние (это всегда так).
Можно форкнуть скрипт, как полностью независимый процесс. Это через
nohup ./do.sh Но, потеряешь интерактив со скриптом, и вывод из скрипта начнёт записывать в файл в домашнем каталоге. Делают вот так: nohup
./do.sh 1>/dev/null 2>/dev/null , но это тоже без интерактива.
Не знаю решаемую задачу и подробности, сам бы делал примерно по шаблону ниже.
Убери set -e и/или set -x, если они не подходят для тебя; они сильно помогают при дебаге, сохранив скрипт простым, но на экране становится очень шумно. Но, т.к. хочешь вызвать скрипт сам из себя, то это может недорого и сильно облегчить отладку.
Обрати внимание, как сделан вызов job. При таком вызове оно не свалится из-за того, что из job делается return ненуля и включён set -e.
#!/bin/bash
PS4="+:\$0:\$LINENO: " # Этот текст дописывается в начале строк, которые появляются на экране после включения отладочного вывода через set -x. LINENO есть в Баше, в Sh её нет, например.
set -x # Показывает выполняемые команды скрипта. При отладке удобно.
set -e # Включает прерывание скрипта по первой встреченной ошибке. Очень удобно. Внутри функций не используется by design.
need_new_launch=123
all_ok=0
function job {
local RIG_local="$1"
if ( echo "$RIG_local" | grep -q "rig" ); then
clear
else
read -p "Input user name: " USR
useradd -m $USR && passwd $USR
return $need_new_launch;
fi
return $all_ok
}
while true ; do
echo "Много разной работы скрипта."
echo "Много работы скрипта."
job "$RIG" || return_code=$? # Обход set -e, когда нужно вернуть неноль из job. Оператор "или" ||: или из левой части $? сразу будет ноль, или сработает правая часть, перехватив $? и выполнив операцию, вернувшую ноль (return_code=$? - вернёт ноль и set -e не выстрелит).
if [ "$return_code" == "$need_new_launch" ] ; then
read -p "Продолжать? [y/n]" answer
if [ "${answer,,}" == "y" ] ; then
continue
fi
break
elif [ "$return_code" == "$all_ok" ] ; then
exit $all_ok
else
break
fi
done
set +x
echo "Всё!"