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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top