GNU/Linux >> Tutoriales Linux >  >> Linux

Bash + ¿Cómo salir del script secundario y del script principal en ambas ocasiones?

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.

Relacionado:¿Cómo cronometrar varios procesos en segundo plano?
Linux
  1. Bash Script para eliminar el archivo más antiguo de una carpeta?

  2. ¿Cómo sé el nombre del archivo de script en un script Bash?

  3. Canalizar hacia/desde el portapapeles en el script Bash

  4. Cómo obtener el estado de salida de un bucle en bash

  5. Bash script para eliminar el archivo más antiguo de una carpeta

Cómo obtener la fecha y hora actuales en Python

Bash break:cómo salir de un bucle

Cómo sincronizar fecha y hora desde la línea de comandos en Ubuntu

Cómo ejecutar un script Bash

LA MANERA FÁCIL de cómo SSH en Bash y WSL2 en Windows 10 desde una máquina externa

¿En qué se parecen el tiempo de CPU y el uso de CPU?