O que você está fazendo aqui é incluir second.sh
e third.sh
como sub-scripts em execução no mesmo processo, chamado "sourcing" na programação de shell. . ./second.sh
é basicamente equivalente a incluir o texto second.sh
nesse ponto. O exit
comando 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.sh
e third.sh
e 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, exit
sai 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.sh
e third.sh
no script pai, precisará continuar fornecendo-as.
O return
built-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 exit
no nível superior, em oposição às funções internas, você poderá mudar exit
para 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 exit
també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.sh
ethird.sh
não fornecê-los?