Ejecutamos el script script1
del guión script_main
script_main
:
#!/bin/bash
/tmp/script1
echo $?
sleep 2
echo script ended
script1
:
#!/bin/bash
exit 1
Como es obvio, script1
sale con el código de salida 1
pero el guión principal continuará hasta el final.
Mi pregunta:¿es posible cuando script1
exit 1
, luego también el main_script
se detendrá de inmediato?
Respuesta aceptada:
La forma más sencilla sería tener explícitamente el primer script exit
si el otro script falla. Ponga la ejecución del script en un condicional, como
otherscript.sh || exit 1
o
if ! otherscript.sh ; then
ret=$?
echo "otherscript failed with exit code $ret. exit." >&2
exit 1
fi
Esto permitiría que el script principal hiciera cualquier limpieza que quisiera, o simplemente intentara alguna otra solución, posiblemente dependiendo de cuál era el código de salida del niño. En el primero, podríamos usar solo || exit
, para pasar el código de salida del niño.
Si desea que el script principal salga cuando cualquiera el comando que inicia falla, luego set -e
.
set -e
otherscript.sh
echo "this will not run if otherscript fails"
set -e
no se aplica a los programas que se ejecutan dentro de construcciones condicionales, por lo que aún podemos probar códigos particulares o seguirlos con || true
ignorar el fracaso. Pero con puntos de salida en todas partes ahora, podríamos usar trap somecmd EXIT
para hacer cualquier limpieza antes de que salga el shell, independientemente de dónde suceda.
También es posible hacer que la secuencia de comandos interna fuerce la salida de la secuencia de comandos principal, pero un poco hostil, no esperaría que una aplicación normal lo hiciera. Pero, si lo desea, simplemente hacer que el script interno dispare su proceso principal es una forma:
$ cat mainscript.sh
#!/bin/bash
./otherscript.sh
echo "$0 exiting normally"
$ cat otherscript.sh
#!/bin/bash
echo "$0 kill $PPID"
kill $PPID
$ bash mainscript.sh
./otherscript.sh kill 11825
Terminated
Aquí, si ejecuta otherscript.sh
desde un caparazón interactivo, intentará disparar la sesión interactiva. Todos los shells que probé parecen ignorar el SIGTERM
en este caso, cuando se ejecuta de forma interactiva, sin embargo. En cualquier caso, el caparazón principal podría volver a trap
el SIGTERM
.
En lugar de disparar solo el proceso principal, podría usar kill 0
para eliminar todos los procesos en el grupo de procesos otherscript.sh
se ejecuta. Si se inicia desde un shell no interactivo, normalmente incluiría el padre.