То, что вы делаете здесь, включает в себя 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в родительском скрипте, то вам нужно будет продолжать их поиск.
В returnBUILTIN выходит только найденный сценарий , а не весь процесс - это одна из немногих различий между включая другой скрипт с .командой , и в том числе его текста в родительском скрипте. Если исходные скрипты вызывают только 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не искать их?