O que você está fazendo aqui é incluir second.she third.shcomo sub-scripts em execução no mesmo processo, chamado "sourcing" na programação de shell. . ./second.shé basicamente equivalente a incluir o texto second.shnesse ponto. O exitcomando sai do processo, não importa se você o chama no script original ou em um script de origem.
Se tudo que você quer fazer é executar os comandos second.she third.she eles não precisam de acesso ou modificar as variáveis e funções a partir do roteiro original, chamar esses scripts como processos filhos.
#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
Se você precisar que os outros scripts acessem variáveis e funções do script original, mas não as modifique, chame esses scripts em subshells. Subshells são processos separados, portanto, exitsai somente deles.
#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
Se você precisar usar variáveis ou funções definidas no second.she third.shno script pai, precisará continuar fornecendo-as.
O returnbuilt-in sai apenas do script de origem e não de todo o processo - essa é uma das poucas diferenças entre incluir outro script com o .comando e incluir seu texto no script pai. Se os scripts de origem chamarem apenas exitno nível superior, em oposição às funções internas, você poderá mudar exitpara return. Você pode fazer isso sem modificar o script usando um 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 exittambém é chamado de funções internas, não acho que exista uma maneira não complicada. Uma maneira complicada é definir uma armadilha de saída e colocar seu código 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, que origina outro arquivo no shell atual. Não há nenhum shell filho ou subshell envolvido. Você queria executá- lossecond.shethird.shnão fornecê-los?