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