在Bash中退出陷阱代码

dan*_*ast 9 bash signals exit-code bash-trap

这是myscript.sh:

#!/bin/bash

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

exit 3
Run Code Online (Sandbox Code Playgroud)

当我运行它:

> ./myscript.sh
echo $?
3
Run Code Online (Sandbox Code Playgroud)

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

  1. echo返回0
  2. 我希望mytrap能回归0
  3. 由于mytrap是最后执行的函数,脚本应返回0

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

Ini*_*ian 8

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

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

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

+ trap mytrap EXIT
+ exit 3
+ mytrap
+ echo 'Trapped!'
Trapped!
Run Code Online (Sandbox Code Playgroud)

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

function mytrap {
    echo "Trapped!"
    exit 1
}
Run Code Online (Sandbox Code Playgroud)

查看脚本的扩展版本,

+ trap mytrap EXIT
+ exit 3
+ mytrap
+ echo 'Trapped!'
Trapped!
+ exit 1
Run Code Online (Sandbox Code Playgroud)

echo $?
1
Run Code Online (Sandbox Code Playgroud)

要捕获trap函数的退出代码,

function mytrap {
    echo "$?"
    echo "Trapped!"
}
Run Code Online (Sandbox Code Playgroud)

  • 如果在陷阱代码中放置一个`exit 1`,那将是脚本的退出代码. (2认同)