There're many exit points in my bash code. I need to do some clean up work on exit, so I used trap to add a callback for exit like this:
trap "mycleanup" EXIT
The problem is there're different exit codes, I need to do corresponding cleanup works. Can I get exit code in mycleanup?
I've found it is better to separate EXIT trap from the trap for other signals
Example trap test script...
The temporary file is cleaned up. The file exit value of 10 is preserved! Interrupts result in an exit value of 2
Basically as long as you don't use "exit" in a EXIT trap, it will exit with the original exit value preserved.
ASIDE: Note the quoting in the EXIT trap. That lets me change what file needs to be cleaned up during the scripts lifetime. I often also include a test for the $tmpfile varables existence, so I don't even need to set it at the start of the script.
I think you can use
$?
to get the exit code.The accepted answer is basically correct, I just want to clarify things.
The following example works well:
But you have to be more careful if doing cleanup inline, without a function. For example this won't work:
Instead you have to escape the
$rv
and$?
variables:You might also want to escape
$tmpdir
, as it will get evaluated when the trap line gets executed and if thetmpdir
value changes later that will not give you the expected behaviour.Edit: Use shellcheck to check your bash scripts and be aware of problems like this.