first.sh
:
#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"
second.sh
:
echo "sono nel secondo script"
dosomething1
exit $?
Если second.sh
обнаруживает ошибку и выходит со статусом -9, first.sh
выходит всегда. Как я могу избежать выхода из первой оболочки, если выходит дочерняя оболочка?
Я не могу редактировать second.sh
.
shell
shell-script
exit
user3589887
источник
источник
.
команду, которая создает другой файл в текущей оболочке. Здесь нет дочерней оболочки или вложенной оболочки. Вы имели в виду выполнить,second.sh
аthird.sh
не искать их?Ответы:
То, что вы делаете здесь, включает в себя
second.sh
и вthird.sh
качестве вспомогательных сценариев, выполняющихся в одном и том же процессе, который называется «источником» в программировании оболочки.. ./second.sh
в основном эквивалентно включению текстаsecond.sh
в этой точке. Командаexit
завершает процесс, не имеет значения, вызываете ли вы ее в исходном сценарии или в исходном сценарии.Если все , что вы хотите сделать , это выполнить команды в
second.sh
иthird.sh
и они не должны получить доступ или изменить переменные и функции от оригинального сценария, называют эти сценарии в качестве дочерних процессов.Если вам нужны другие сценарии для доступа к переменным и функциям из исходного сценария, но не для их изменения, то вызовите эти сценарии в подоболочках. Подоболочки - это отдельные процессы, поэтому
exit
выходят только они.Если вам нужно использовать переменные или функции, определенные в
second.sh
иthird.sh
в родительском скрипте, то вам нужно будет продолжать их поиск.В
return
BUILTIN выходит только найденный сценарий , а не весь процесс - это одна из немногих различий между включая другой скрипт с.
командой , и в том числе его текста в родительском скрипте. Если исходные скрипты вызывают толькоexit
на верхнем уровне, в отличие от внутренних функций, то вы можете перейтиexit
вreturn
. Вы можете сделать это без изменения сценария, используя псевдоним.Если
exit
также вызывается внутри функций, я не думаю, что есть не обременительный способ. Громоздкий способ - установить ловушку выхода и поместить туда свой код.источник
Вместо того чтобы использовать вторую и третью оболочки, просто запустите их, как и любую другую команду. Код выхода может быть сохранен и использован при необходимости, например, так:
источник
STATUS1=$?
поймает результат ранее введенной команды эха, который не зависит от результата./second.sh
.Попробуйте это так (сначала удалите
.
при вызовеsecond.sh
):first.sh
:second.sh
:Это потому, что
.
это шорткод, из-заsource
которого второй скрипт включается как часть первого.источник