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 $?
Se second.sh
detecta um erro e sai com o status -9, first.sh
sai sempre. Como evitar sair do primeiro shell se o shell filho sair?
Não consigo editar second.sh
.
shell
shell-script
exit
user3589887
fonte
fonte
.
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?Respostas:
O que você está fazendo aqui é incluir
second.sh
ethird.sh
como sub-scripts em execução no mesmo processo, chamado "sourcing" na programação de shell.. ./second.sh
é basicamente equivalente a incluir o textosecond.sh
nesse ponto. Oexit
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
ethird.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.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.Se você precisar usar variáveis ou funções definidas no
second.sh
ethird.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 apenasexit
no nível superior, em oposição às funções internas, você poderá mudarexit
parareturn
. Você pode fazer isso sem modificar o script usando um alias.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á.fonte
Em vez de procurar o segundo e o terceiro shell, execute-os como faria com qualquer outro comando. O código de saída pode ser armazenado e usado se você precisar, da seguinte forma:
fonte
STATUS1=$?
irá capturar o resultado do comando de eco emitido anteriormente, que é independente do resultado de./second.sh
.Tente desta maneira (remova primeiro
.
ao ligarsecond.sh
):first.sh
:second.sh
:Isso ocorre porque
.
é um código de acessosource
que faz com que o segundo script seja incluído como parte do primeiro.fonte