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
我发现[通过]调用
exit
trap 可以改变退出状态。普通命令,无论失败还是成功,都不会改变退出状态。现在我想知道,我是否可以依赖这种行为,或者这是一些实现怪癖?
是的,您可以依赖它,并且它已记录在 shell标准中:
名称
exit
- 导致 shell 退出
...
描述
...
陷阱EXIT
应在 shell 终止之前执行,除非exit
在该陷阱本身中调用实用程序,在这种情况下 shell 应立即退出。
...
退出状态如果指定,
退出状态应为,但如果不是无符号十进制整数或大于 ,n
则行为未指定。否则,该值应为最后执行的命令的退出值,如果没有执行命令则为零。当在陷阱操作中执行时,最后一个命令被认为是紧接在陷阱操作之前执行的命令。n
255
exit
(同样的事情return
)
当没有exit
命令但exit
设置了陷阱时,应应用以下内容:
除非另有说明,命令的退出状态应为该命令执行的最后一个简单命令的退出状态。
以及关于复合命令、顺序列表等的所有规则,这些规则对于陷阱的存在没有特殊的例外EXIT
。