Exit code of traps in Bash

2019-03-26 15:16发布

问题:

This is myscript.sh:

#!/bin/bash

function mytrap {
    echo "Trapped!"
}
trap mytrap EXIT

exit 3

And when I run it:

> ./myscript.sh
echo $?
3

Why is the exit code of the script the exit code with the trap the same as without it? Usually, a function returns implicitly the exit code of the last command executed. In this case:

  1. echo returns 0
  2. I would expect mytrap to return 0
  3. Since mytrap is the last function executed, the script should return 0

Why is this not the case? Where is my thinking wrong?

回答1:

Look the reference from the below man bash page,

exit [n] Cause the shell to exit with a status of n. If n is omitted, the exit status is that of the last command executed. A trap on EXIT is executed before the shell terminates.

You have the debug version of the script to prove that,

+ trap mytrap EXIT
+ exit 3
+ mytrap
+ echo 'Trapped!'
Trapped!

Consider the same as you mentioned in your comments, the trap function returning an error code,

function mytrap {
    echo "Trapped!"
    exit 1
}

Look the expanded version of the script,

+ trap mytrap EXIT
+ exit 3
+ mytrap
+ echo 'Trapped!'
Trapped!
+ exit 1

and

echo $?
1

To capture the exit code on trap function,

function mytrap {
    echo "$?"
    echo "Trapped!"
}