10

这是myscript.sh

#!/bin/bash

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

exit 3

当我运行它时:

> ./myscript.sh
echo $?
3

为什么脚本的退出码和不带trap的退出码一样?通常,函数会隐式返回最后执行的命令的退出代码。在这种情况下:

  1. 回声返回 0
  2. 我希望mytrap返回 0
  3. 由于mytrap是执行的最后一个函数,因此脚本应返回 0

为什么不是这样?我的想法哪里错了?

4

1 回答 1

10

从下面的man bash页面查看参考,

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

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

+ 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!"
}
于 2017-01-12T17:47:03.273 回答