在Bash中退出陷阱代码

时间:2017-01-12 17:39:45

标签: bash signals exit-code trap

这是myscript.sh

#!/bin/bash

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

exit 3

当我运行它时:

> ./myscript.sh
echo $?
3

为什么脚本的退出代码与陷阱的退出代码相同而没有它?通常,函数隐式返回最后执行的命令的退出代码。在这种情况下:

  1. echo返回0
  2. 我希望mytrap返回0
  3. 由于mytrap是最后执行的函数,因此脚本应返回0
  4. 为什么不是这样?我的想法在哪里错了?

1 个答案:

答案 0 :(得分:8)

查看以下man bash页面的参考资料

  

退出[n]   导致shell退出状态为n。如果省略n,则退出状态是最后执行的命令的状态。在退出 之前,退出上的陷阱会终止。

你有脚本的调试版本来证明,

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

考虑与您在评论中提到的相同,trap函数返回错误代码

function mytrap {
    echo "Trapped!"
    exit 1
}

查看脚本的扩展版本,

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

echo $?
1

捕获trap函数

上的退出代码
function mytrap {
    echo "$?"
    echo "Trapped!"
}