代码之家  ›  专栏  ›  技术社区  ›  Sachin

当设置了-e选项时,如何避免bash脚本失败?

  •  40
  • Sachin  · 技术社区  · 12 年前

    我有一个bash脚本 -e 选项集,在第一个错误时会使整个脚本失败。

    在剧本中,我试图做一个 ls 在目录上。但这条道路可能存在,也可能不存在。如果路径不存在,则 ls 命令失败,因为 -e 标志被设置。

    有没有一种方法可以防止脚本失败?

    顺便说一句,我已经试过了 set +e set -e 在该命令之前和之后,它都起作用。但我正在寻找更好的解决方案。

    3 回复  |  直到 12 年前
        1
  •  57
  •   chepner    12 年前

    您可以使用“捕获”错误 || 以及一个保证以0状态退出的命令:

    ls $PATH || echo "$PATH does not exist"
    

    由于复合命令无论是否成功 $PATH 存在, set -e 不会被触发,您的脚本也不会退出。

    要静默地抑制错误,可以使用 true 命令:

    ls $PATH || true
    

    要执行多个命令,可以使用其中一个复合命令:

    ls $PATH || { command1; command2; }
    

    ls $PATH || ( command1; command2 )
    

    只要确保两个复合命令中都没有任何失败。第二个示例的一个好处是,您可以在不影响其在当前shell中的状态的情况下关闭子shell内的立即退出模式:

    ls $PATH || ( set +e; do-something-that-might-fail )
    
        2
  •  5
  •   procleaf    12 年前

    另一种选择是使用 trap 抓住 EXIT 信号:

    trap 'echo "ls failed" ; some_rescue_action' EXIT
    ls /non_exist
    
        3
  •  3
  •   Majid Laissi    12 年前

    一种解决方案是测试文件夹的存在

    function myLs() {
        LIST=""
        folder=$1
        [ "x$folder" = "x" ] && folder="."
        [ -d $folder ] && LIST=`ls $folder`
        echo $LIST
    }
    

    这样bash就不会失败,如果 $folder 不存在