Intenta entender el código correctamente antes de utilizarlo a tu trabajo y si ttienes algo que aportar puedes dejarlo en la sección de comentarios.
Solución:
Podría decidir que el estado de salida 77, por ejemplo, significa salir de cualquier nivel de subcapa, y hacer
set -E
trap '[ "$?" -ne 77 ] || exit 77' ERR
(
echo here
(
echo there
(
exit 12 # not 77, exit only this subshell
)
echo ici
exit 77 # exit all subshells
)
echo not here
)
echo not here either
set -E
en combinación con ERR
trampas es un poco como una versión mejorada de set -e
ya que le permite definir su propio manejo de errores.
En zsh, las trampas ERR se heredan automáticamente, por lo que no necesita set -E
también puede definir trampas como TRAPERR()
funciones y modificarlas mediante $functions[TRAPERR]
me gusta functions[TRAPERR]="echo was here; $functions[TRAPERR]"
Tú pudo matar el caparazón original (kill $$
) antes de llamar exit
, y eso probablemente funcionaría. Pero:
- me parece bastante feo
- se romperá si tiene una segunda subcapa allí, es decir, use una subcapa dentro de una subcapa.
En su lugar, puede usar una de las varias formas de devolver un valor en las preguntas frecuentes de Bash. La mayoría de ellos no son tan buenos, desafortunadamente. Es posible que se quede atascado comprobando errores después de cada llamada de función (-e
tiene muchos problemas). O eso, o cambiar a Perl.
Como alternativa a kill $$
también puedes probar kill 0
funcionará en el caso de subcapas anidadas (todas las personas que llaman y el proceso lateral recibirán la señal)… pero sigue siendo brutal y feo.
Al final de la post puedes encontrar las referencias de otros usuarios, tú aún tienes la libertad de insertar el tuyo si lo deseas.