To, co tutaj robisz, obejmuje second.sh
i third.sh
jako skrypty działające w tym samym procesie, co w programowaniu powłoki nazywa się „pozyskiwaniem”. . ./second.sh
jest w zasadzie równoważne z dołączeniem tekstu second.sh
w tym momencie. exit
Komenda 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.sh
i third.sh
nie 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ą exit
tylko 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.sh
a third.sh
w skrypcie macierzystej, a następnie trzeba je zachować pozyskiwania.
Do return
wyjś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 exit
na najwyższym poziomie, w przeciwieństwie do funkcji wewnętrznych, możesz zmienić exit
na 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 exit
nazywane 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.sh
ithird.sh
zamiast ich pozyskiwania?