BASH:更改陷阱中的退出状态

Zol*_* K. 5 bash trap exit-status

我可以为陷阱处理程序中的 shell 脚本分配不同的退出状态吗?

通过反复试验,我发现调用exit退出trap状态是可以改变的。普通命令,无论失败还是成功,都不会改变退出状态。

现在我想知道,我是否可以依赖这种行为,或者这是一些实现怪癖?

我一直试图找到一些关于此的文档,但无济于事。

测试脚本:

#!/bin/bash
function handler {
    # a successful command won't change script exit status
    echo handler, status=$1
    # badcommand won't change script exit status
    #badcommand
    # exit will change script exit status
    #exit 23
}
trap 'handler $?' EXIT
#badcommand
Run Code Online (Sandbox Code Playgroud)

用法:

./trap_test.sh; echo status_out=$?
Run Code Online (Sandbox Code Playgroud)

小智 7

我发现[通过]调用exittrap 可以改变退出状态。普通命令,无论失败还是成功,都不会改变退出状态。现在我想知道,我是否可以依赖这种行为,或者这是一些实现怪癖?

是的,您可以依赖它,并且它已记录在 shell标准中:

名称
exit- 导致 shell 退出
...
描述
...
陷阱EXIT应在 shell 终止之前执行,除非exit在该陷阱本身中调用实用程序,在这种情况下 shell 应立即退出。
...
退出状态如果指定,
退出状态应为,但如果不是无符号十进制整数或大于 ,n则行为未指定。否则,该值应为最后执行的命令的退出值,如果没有执行命令则为零。在陷阱操作中执行时,最后一个命令被认为是紧接在陷阱操作之前执行的命令。n255exit

(同样的事情return

当没有exit命令但exit设置了陷阱时,应应用以下内容:

除非另有说明,命令的退出状态应为该命令执行的最后一个简单命令的退出状态。

以及关于复合命令、顺序列表等的所有规则,这些规则对于陷阱的存在没有特殊的例外EXIT