Lo que está haciendo aquí es incluir second.sh
y third.sh
como sub-scripts que se ejecutan en el mismo proceso, que se denomina "abastecimiento" en la programación de shell. . ./second.sh
es básicamente equivalente a incluir el texto second.sh
en ese punto. El exit
comando sale del proceso, no importa si lo llama en el script original o en un script de origen.
Si todo lo que quiere hacer es ejecutar los comandos second.sh
y third.sh
y ellos no tienen que acceder o modificar las variables y funciones de la escritura original, llama a estos scripts en subprocesos.
#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
Si necesita los otros scripts para acceder a las variables y funciones del script original, pero no modificarlos, llame a estos scripts en subcapas. Las subcapas son procesos separados, por lo que exit
solo sale de ellas.
#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
Si necesita utilizar variables o funciones definidas en second.sh
y third.sh
en la secuencia de comandos principal, deberá seguir obteniendo fuentes.
El return
builtin sale solo del script de origen y no de todo el proceso; esa es una de las pocas diferencias entre incluir otro script con el .
comando e incluir su texto en el script principal. Si las secuencias de comandos de origen solo llaman exit
al nivel superior, en oposición a las funciones internas, entonces puede cambiar exit
a return
. Puede hacerlo sin modificar el script utilizando 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"
Si exit
también se llama funciones internas, no creo que haya una manera no engorrosa. Una forma engorrosa es establecer una trampa de salida y poner su código allí.
#!/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 genera otro archivo en el shell actual. No hay un shell o subshell secundario involucrado. ¿Querías ejecutarsecond.sh
y enthird.sh
lugar de buscarlos?