first.sh
:
#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"
second.sh
:
echo "sono nel secondo script"
dosomething1
exit $?
Jeśli second.sh
wykryje błąd i wyjdzie ze statusem -9, first.sh
kończy zawsze. Jak mogę uniknąć wychodzenia z pierwszej powłoki, jeśli powłoka potomna zostanie zamknięta?
Nie mogę edytować second.sh
.
shell
shell-script
exit
użytkownik3589887
źródło
źródło
.
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?Odpowiedzi:
To, co tutaj robisz, obejmuje
second.sh
ithird.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 tekstusecond.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
ithird.sh
nie muszą one uzyskiwać dostępu ani modyfikować zmiennych i funkcji z oryginalnego skryptu, wywołaj te skrypty jako procesy potomne.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.Jeśli trzeba użyć zmiennych lub funkcji zdefiniowanych w
second.sh
athird.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ą tylkoexit
na najwyższym poziomie, w przeciwieństwie do funkcji wewnętrznych, możesz zmienićexit
nareturn
. Możesz to zrobić bez modyfikowania skryptu za pomocą aliasu.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.źródło
Zamiast pozyskiwać drugą i trzecią powłokę, po prostu uruchom je tak, jak inne polecenia. Kod wyjścia można zapisać i wykorzystać, jeśli zajdzie taka potrzeba:
źródło
STATUS1=$?
wyłapie wynik poprzednio wydanej komendy echo, która jest niezależna od wyniku./second.sh
.Wypróbuj w ten sposób (najpierw usuń
.
podczas rozmowysecond.sh
):first.sh
:second.sh
:Wynika to z faktu, że
.
jest to krótki kod, dlasource
którego drugi skrypt jest dołączany jako część pierwszego.źródło