To, co tutaj robisz, obejmuje second.shi third.shjako skrypty działające w tym samym procesie, co w programowaniu powłoki nazywa się „pozyskiwaniem”. . ./second.shjest w zasadzie równoważne z dołączeniem tekstu second.shw tym momencie. exitKomenda zakończy procedurę, to nie ma znaczenia, czy to nazwać w oryginalnym skrypcie lub pozyskiwane w skrypcie.
Jeśli wszystko, co chcesz zrobić, to uruchomić polecenia second.shi third.shnie muszą one uzyskiwać dostępu ani modyfikować zmiennych i funkcji z oryginalnego skryptu, wywołaj te skrypty jako procesy potomne.
#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
Jeśli potrzebujesz innych skryptów, aby uzyskać dostęp do zmiennych i funkcji z oryginalnego skryptu, ale ich nie modyfikować, wywołaj te skrypty w podpowłokach. Podkładki są oddzielnymi procesami, więc zamykają exittylko je.
#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
Jeśli trzeba użyć zmiennych lub funkcji zdefiniowanych w second.sha third.shw skrypcie macierzystej, a następnie trzeba je zachować pozyskiwania.
Do returnwyjścia wbudowane tylko pozyskiwane skrypt i nie cały proces - to jeden z niewielu różnic między tym inny skrypt z .poleceniem i tym swój tekst w skrypcie macierzystej. Jeśli pozyskane skrypty wywołują tylko exitna najwyższym poziomie, w przeciwieństwie do funkcji wewnętrznych, możesz zmienić exitna return. Możesz to zrobić bez modyfikowania skryptu za pomocą aliasu.
#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"
Jeśli exitnazywane są również funkcjami wewnętrznymi, nie sądzę, że istnieje nieporęczny sposób. Uciążliwym sposobem jest ustawienie pułapki wyjścia i umieszczenie tam kodu.
#!/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
.polecenia, które pobiera inny plik w bieżącej powłoce. Nie ma w tym żadnej powłoki potomnej ani podpowłoki. Czy chodziło Ci się wykonaćsecond.shithird.shzamiast ich pozyskiwania?