【问题标题】:How to avoid a bash script from failing when -e option is set?设置 -e 选项时如何避免 bash 脚本失败?
【发布时间】:2012-09-12 08:48:09
【问题描述】:

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

在脚本中,我试图在目录上执行ls。但这条路可能存在也可能不存在。如果路径不存在,ls 命令将失败,因为设置了-e 标志。

有什么方法可以防止脚本失败?

作为旁注,我已经尝试过在该命令之前和之后执行set +eset -e 的技巧,它可以工作。但我正在寻找更好的解决方案。

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    您可以使用|| 和保证以 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 )
    

    【讨论】:

    • 感谢您的回复。我仍然有几个疑问。如果ls 命令失败,它仍然会打印一条消息,说某某路径不存在,有没有办法抑制它?另外,在OR部分,有没有办法执行2行代码?
    【解决方案2】:

    另一种选择是使用trap 来捕获EXIT 信号:

    trap 'echo "ls failed" ; some_rescue_action' EXIT
    ls /non_exist
    

    【讨论】:

      【解决方案3】:

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

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

      如果$folder 不存在,这种方式bash 不会失败

      【讨论】:

        猜你喜欢
        • 2021-04-05
        • 2015-10-15
        • 2015-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-03
        相关资源
        最近更新 更多