bash function exit subshell

¿Hay alguna forma de escribir una función bash que anule toda la ejecución, sin importar cómo se llame?



function exit (4)

Estaba usando la instrucción "exit 1" en mis funciones bash para terminar todo el script y funcionó bien:

function func() { echo "Goodbye" exit 1 } echo "Function call will abort" func echo "This will never be printed"

Pero luego me di cuenta de que no hace el trabajo cuando me llaman así:

res=$(func)

Entiendo que he creado una subshell y "exit 1" cancela esa subshell y no la primaria ....

Pero, ¿hay alguna manera de escribir una función que anule toda la ejecución, sin importar cómo se llame? Solo necesito obtener el verdadero valor de retorno (repetido por la función).


Lo que podría hacer es registrar el shell de nivel superior para que salga la señal TERM , y luego enviar un TERM a la shell de nivel superior:

#!/bin/bash trap "exit 1" TERM export TOP_PID=$$ function func() { echo "Goodbye" kill -s TERM $TOP_PID } echo "Function call will abort" echo $(func) echo "This will never be printed"

Entonces, su función envía una señal TERM al nivel superior del shell, que es capturado y manejado usando el comando provisto, en este caso, "exit 1" .


Pero, ¿hay alguna manera de escribir una función que anule toda la ejecución, sin importar cómo se llame?

No.

Solo necesito obtener el verdadero valor de retorno (repetido por la función).

Usted puede

res=$(func) echo $?


Puede usar set -e que sale si un comando sale con un estado distinto de cero :

set -e func set +e

O agarre el valor de retorno:

(func) || exit $?


Un proceso hijo no puede obligar al proceso primario a cerrarse implícitamente. Necesitas usar algún tipo de mecanismo de señalización. Las opciones pueden incluir un valor de retorno especial, o tal vez enviar una señal con kill , algo así como

function child() { local parent_pid="$1" local other="$2" ... if [[ $failed ]]; then kill -QUIT "$parent_pid" fi }