首页 文章

Bash忽略特定命令的错误

提问于
浏览
304

我正在使用以下选项

set -o pipefail
set -e

在bash脚本中停止执行错误 . 我有100个脚本执行,我不想检查脚本的返回代码 . 但对于特定的脚本,我想忽略错误 . 我怎样才能做到这一点 ?

6 回答

  • 126

    只需在要忽略错误的命令后添加 || true 即可 .

  • 513

    如果您希望脚本在特定命令失败时不停止并且您还希望保存失败命令的错误代码,以防万一!

    code

    set -e;
    command || EXIT_CODE=$? && true ; 
    echo $EXIT_CODE
    
  • 45

    在使用CLI工具时我一直在使用下面的代码段,我想知道是否存在某些资源,但我不关心输出 .

    if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
        echo "none exist actually exist!"
    fi
    
  • 1

    解决方案:

    particular_script || true
    

    例:

    $ cat /tmp/1.sh
    particular_script()
    {
        false
    }
    
    set -e
    
    echo ein
    particular_script || true
    echo zwei
    particular_script
    echo drei
    
    $ bash /tmp/1.sh
    ein
    zwei
    

    永远不会打印 drei .

    另外,我想补充一点,当 pipefail 打开时,当管道中的一个命令具有非零退出代码时,shell认为整个管道具有非零退出代码就足够了( pipefail 关闭它必须是最后一个一) .

    $ set -o pipefail
    $ false | true ; echo $?
    1
    $ set +o pipefail
    $ false | true ; echo $?
    0
    
  • 26

    您也可以使用"noop"或null实用程序(如POSIX specs中所述) : 而不是"do nothing"而不是"returning true" . 你会节省几封信 . :)

    #!/usr/bin/env bash
    set -e
    man nonexistentghing || :
    echo "It's ok.."
    
  • 30

    更简洁:

    ! particular_script
    

    POSIX specification关于 set -e (强调我的):

    启用此选项时,如果由于Shell错误的后果中列出的任何原因导致简单命令失败,或者返回退出状态值> 0,并且在while,until或if关键字之后不是复合列表的一部分,并且不是AND或OR列表的一部分,并且不是以!开头的管道!保留字,然后外壳应立即退出 .

相关问题