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.sh
detecta un error y sale con el estado -9, first.sh
siempre 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.sh
y enthird.sh
lugar de buscarlos?Respuestas:
Lo que está haciendo aquí es incluir
second.sh
ythird.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 textosecond.sh
en ese punto. Elexit
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
ythird.sh
y 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
exit
solo sale de ellas.Si necesita utilizar variables o funciones definidas en
second.sh
ythird.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 llamanexit
al nivel superior, en oposición a las funciones internas, entonces puede cambiarexit
areturn
. Puede hacerlo sin modificar el script utilizando un alias.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í.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 elsource
que se incluye el segundo script como parte del primero.fuente