Cómo atrapar el código de salida en el script bash
Pregunta
Hay muchos puntos de salida en mi código de bash. Necesito hacer un trabajo de limpieza en la salida, así que usé trampa para agregar una devolución de llamada para salir como esta:
trap "mycleanup" EXIT
El problema es que hay diferentes códigos de salida, necesito hacer los trabajos de limpieza correspondientes. ¿Puedo obtener el código de salida en MyCleanup?
Solución
Creo que puedes usar $?
Para obtener el código de salida.
Otros consejos
La respuesta aceptada es básicamente correcta, solo quiero aclarar las cosas.
El siguiente ejemplo funciona bien:
#!/bin/bash
cleanup() {
rv=$?
rm -rf "$tmpdir"
exit $rv
}
tmpdir="$(mktemp)"
trap "cleanup" INT TERM EXIT
# Do things...
Pero debe tener más cuidado si se hace una limpieza en línea, sin una función. Por ejemplo, esto no funcionará:
trap "rv=$?; rm -rf $tmpdir; exit $rv" INT TERM EXIT
En su lugar tienes que escapar del $rv
y $?
Variables:
trap "rv=\$?; rm -rf $tmpdir; exit \$rv" INT TERM EXIT
Es posible que también quieras escapar $tmpdir
, como se evaluará cuando la línea de trampa se ejecute y si el tmpdir
Cambios de valor más tarde que no le darán el comportamiento esperado.
Editar: usar chellera Para verificar sus scripts bash y tener en cuenta problemas como este.
Descubrí que es mejor separar la trampa de salida de la trampa para otras señales
Ejemplo de script de prueba de trampa ...
umask 77
tmpfile=`tmpfile.$$`
trap 'rm -f "$tmpfile"' EXIT
trap 'exit 2' HUP INT QUIT TERM
touch $tmpfile
read -r input
exit 10
El archivo temporal se limpia. ¡Se conserva el valor de salida del archivo de 10! Las interrupciones dan como resultado un valor de salida de 2
Básicamente, siempre que no use "salida" en una trampa de salida, saldrá con el valor de salida original conservado.
Aparte: Tenga en cuenta las citas en la trampa de salida. Eso me permite cambiar qué archivo debe limpiarse durante la vida útil de los scripts. A menudo también incluyo una prueba para la existencia de $ tmpfile antes de intentar eliminarlo, por lo que ni siquiera necesito configurarla al comienzo del script, solo antes de crearlo.