То, что вы делаете здесь, включает в себя second.sh
и в third.sh
качестве вспомогательных сценариев, выполняющихся в одном и том же процессе, который называется «источником» в программировании оболочки. . ./second.sh
в основном эквивалентно включению текста second.sh
в этой точке. Команда exit
завершает процесс, не имеет значения, вызываете ли вы ее в исходном сценарии или в исходном сценарии.
Если все , что вы хотите сделать , это выполнить команды в second.sh
и third.sh
и они не должны получить доступ или изменить переменные и функции от оригинального сценария, называют эти сценарии в качестве дочерних процессов.
#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
Если вам нужны другие сценарии для доступа к переменным и функциям из исходного сценария, но не для их изменения, то вызовите эти сценарии в подоболочках. Подоболочки - это отдельные процессы, поэтому exit
выходят только они.
#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
Если вам нужно использовать переменные или функции, определенные в second.sh
и third.sh
в родительском скрипте, то вам нужно будет продолжать их поиск.
В return
BUILTIN выходит только найденный сценарий , а не весь процесс - это одна из немногих различий между включая другой скрипт с .
командой , и в том числе его текста в родительском скрипте. Если исходные скрипты вызывают только exit
на верхнем уровне, в отличие от внутренних функций, то вы можете перейти exit
в return
. Вы можете сделать это без изменения сценария, используя псевдоним.
#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"
Если exit
также вызывается внутри функций, я не думаю, что есть не обременительный способ. Громоздкий способ - установить ловушку выхода и поместить туда свой код.
#!/bin/ksh
do_first () {
echo "prova"
trap "after_second" EXIT
. ./second.sh
after_second
}
after_second () {
echo "ho lanciato il secondo"
trap "after_third" EXIT
. ./third.sh
after_third
}
after_third () {
trap - EXIT
echo "ho lanciato il terzo"
}
do_first
.
команду, которая создает другой файл в текущей оболочке. Здесь нет дочерней оболочки или вложенной оболочки. Вы имели в виду выполнить,second.sh
аthird.sh
не искать их?