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 $?
Si second.shdetecta un error y sale con el estado -9, first.shsiempre sale. ¿Cómo puedo evitar salir del primer shell si sale el shell secundario?
No puedo editar second.sh.
shell
shell-script
exit
usuario3589887
fuente
fuente

.comando, que genera otro archivo en el shell actual. No hay un shell o subshell secundario involucrado. ¿Querías ejecutarsecond.shy enthird.shlugar de buscarlos?Respuestas:
Lo que está haciendo aquí es incluir
second.shythird.shcomo sub-scripts que se ejecutan en el mismo proceso, que se denomina "abastecimiento" en la programación de shell.. ./second.shes básicamente equivalente a incluir el textosecond.shen ese punto. Elexitcomando 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.shythird.shy ellos no tienen que acceder o modificar las variables y funciones de la escritura original, llama a estos scripts en subprocesos.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
exitsolo sale de ellas.Si necesita utilizar variables o funciones definidas en
second.shythird.shen la secuencia de comandos principal, deberá seguir obteniendo fuentes.El
returnbuiltin 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 llamanexital nivel superior, en oposición a las funciones internas, entonces puede cambiarexitareturn. Puede hacerlo sin modificar el script utilizando un alias.Si
exittambié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í.fuente
En lugar de obtener el segundo y el tercer shell, simplemente ejecútelos como lo haría con cualquier otro comando. El código de salida se puede almacenar y usar si lo necesita, así:
fuente
STATUS1=$?capturará el resultado del comando echo emitido anteriormente, que es independiente del resultado de./second.sh.Pruébelo de esta manera (elimine primero
.al llamarsecond.sh):first.sh:second.sh:Esto se debe a que
.es un código corto para elsourceque se incluye el segundo script como parte del primero.fuente