Así que tengo un pequeño script para ejecutar algunas pruebas.
javac *.java && java -ea Test
rm -f *.class
Ahora el problema con esto es que cuando ejecuto el script ./test
, devolverá un código de salida exitoso incluso si la prueba falla porque rm -f *.class
tiene éxito.
La única forma en que puedo pensar en hacer que haga lo que quiero me parece fea:
javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
if [ "$test_exit_code" != 0 ] ; then false; fi
Pero esto parece un problema común: realice una tarea, limpie y luego devuelva el código de salida de la tarea original.
¿Cuál es la forma más idiomática de hacer esto (en bash o simplemente conchas en general)?
bash
shell
exit-status
math4tots
fuente
fuente
eval
Siempre es un favorito de los fanáticos.Yo iría con:
¿Por qué saltar cuando
exit
está disponible?Podrías usar un
trap
:Por ejemplo:
fuente
exit ${last_error_code:=0}
.Hasta donde sé, lo más cercano que bash tiene a un
try...finally
bloque de un lenguaje de programación más parecido a C (que es lo que probablemente desearía si estuviera disponible) es latrap
construcción, que funciona así:Esto ejecutará "rm -f * .class" cuando salga el script. Si tiene algo más complejo que hacer, puede ponerlo en una función:
Si está tan inclinado, puede convertir esto en un lenguaje bastante general que funciona más o menos como un
try...catch...finally
bloque en C. Algo así:Tenga en cuenta que los paréntesis delimitan una subshell; Con esta construcción, solo la subshell sale si falla un comando, no todo el script. Recuerde que las subcapas son algo computacionalmente caras, así que no use demasiadas (cientos) de ellas. Dependiendo de su script, puede lograr el mismo efecto de manera más eficiente con las funciones de shell y
trap ... RETURN
, pero eso depende de usted para investigar.fuente