结果:

结果:

我有几个关于错误陷阱的问题想了解。

  1. 为什么下面的代码只执行 1 个陷阱而不是 2 个,特别是只执行带有“mydir2”而不是“mydir1”的代码?
  2. 它到底为什么要执行陷阱?
  3. 为什么如果将命令编写为标记代码,则根本不会生成陷阱。
  4. 编写此代码的最佳/正确方法是什么。
  5. 为什么以及如何获取错误命令的正确行号而不是函数 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.

相关内容