Що ви тут робите, це включення 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замість них джерела?