Quello che stai facendo qui è includere second.sh
e third.sh
come script secondari in esecuzione nello stesso processo, che viene chiamato "sourcing" nella programmazione della shell. . ./second.sh
è sostanzialmente equivalente a includere il testo di second.sh
a quel punto. Il exit
comando esce dal processo, non importa se lo chiami nello script originale o in uno script di provenienza.
Se tutto ciò che vuoi fare è eseguire i comandi second.sh
e third.sh
non è necessario che accedano o modifichino variabili e funzioni dallo script originale, chiama questi script come processi figlio.
#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
Se hai bisogno degli altri script per accedere a variabili e funzioni dallo script originale, ma non modificarli, chiama questi script in subshells. I sotto-shell sono processi separati, quindi ne exit
escono solo.
#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
Se è necessario utilizzare variabili o funzioni definite in second.sh
e third.sh
nello script principale, è necessario continuare a reperirle.
Il return
builtin esce solo dallo script di provenienza e non dall'intero processo - questa è una delle poche differenze tra l'inclusione di un altro script con il .
comando e l'inclusione del suo testo nello script principale. Se gli script di origine chiamano solo exit
al livello superiore, al contrario delle funzioni interne, è possibile cambiare exit
in return
. Puoi farlo senza modificare lo script usando un alias.
#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"
Se exit
viene anche chiamato funzioni interne, non penso che ci sia un modo non ingombrante. Un modo ingombrante è impostare una trappola di uscita e inserire il codice lì.
#!/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
.
comando, che genera un altro file nella shell corrente. Non ci sono shell secondarie o subshell coinvolte. Intendevi eseguiresecond.sh
ethird.sh
invece di acquistarli?