我有几个关于错误陷阱的问题想了解。
- 为什么下面的代码只执行 1 个陷阱而不是 2 个,特别是只执行带有“mydir2”而不是“mydir1”的代码?
- 它到底为什么要执行陷阱?
- 为什么如果将命令编写为标记代码,则根本不会生成陷阱。
- 编写此代码的最佳/正确方法是什么。
为什么以及如何获取错误命令的正确行号而不是函数 FuncA 的行号?
#!/bin/bash set -o errtrace trap 'printerr' ERR function printerr(){ local lc="$BASH_COMMAND" rc=$? ln=${BASH_LINENO[$i]} echo "$(date +%s) : Command [ $lc ] exited with code [ $rc ] in line [ $ln ]" } function FuncA(){ [[ -d mydir1 ]] && echo mydir1OK [[ -d mydir2 ]] && echo mydir2OK #if [ -d /mtdir/ ] ;then # echo OKMYDIR #fi } FuncA
结果:
1457453672 : Command [ [[ -d mydir2 ]] ] exited with code [ 1 ] in line [ 13 ]
答案1
似乎执行了 ERR 陷阱,因为函数 FuncA 具有非零退出状态。如记录在man bash
函数的退出状态是函数体中执行的最后一个命令的退出状态。
在本例中,是[[ -d mydir2 ]]
.您可以添加 atrue
作为函数中的最后一个命令来防止它。
结构if
不同,因为(同一手册):
退出状态是最后执行的命令的退出状态,如果没有条件测试为真,则退出状态为零。
我建议使用if
而不是添加true
.