The accepted answer is basically correct, I just want to clarify things.
The following example works well:
#!/bin/bash
cleanup() {
rv=$?
rm -rf "$tmpdir"
exit $rv
}
tmpdir="$(mktemp)"
trap "cleanup" EXIT
# Do things...
But you have to be more careful if doing cleanup inline, without a function. For example this won't work:
trap "rv=$?; rm -rf $tmpdir; exit $rv" EXIT
Instead you have to escape the $rv
and $?
variables:
trap "rv=\$?; rm -rf $tmpdir; exit \$rv" EXIT
You might also want to escape $tmpdir
, as it will get evaluated when the trap line gets executed and if the tmpdir
value changes later that might not give the expected behaviour.
Edit: Use shellcheck to check your bash scripts and be aware of problems like this.