【问题标题】:Check grep return code检查 grep 返回码
【发布时间】:2015-03-30 16:42:08
【问题描述】:

我的脚本包含以下设置:

set -o errexit
set -o pipefail
set -o nounset

现在我想对文件 b 中的字母 A 进行 o grep(不是 sed、awk 等),并将结果添加到文件 c:

grep A b >> C

问题是,如果在 b 文件中找不到 A,grep 会以 RC 1 退出,在我的情况下这很好,因为我不认为这是一个问题。 在那种情况下,我将 grep 命令包装在一个函数中并运行:

function func_1() {
  grep A b >> C
}

if func_1; then
  echo "OK"
else
  echo "STILL OK"
end

一切都很好,但很快我意识到捕获 RC=2(grep 失败)会很好。我该怎么做?

【问题讨论】:

    标签: bash unix grep exit-code


    【解决方案1】:

    我不明白这如何保护您免受 set -e 的影响

    我认为您需要一个在持续时间内禁用 errexit 的包装函数,例如:

    function func_2 {
        set +o errexit
        func_1 "$@"
        rc=$?
        set -o errexit
        echo "$rc"
    }
    
    case $(func_2) in
        0) echo "success" ;;
        1) echo "not found" ;;
        2) echo "trouble in grep-land" ;; 
    esac
    

    仔细阅读set -e 的文档,您可以在某些情况下处理具有非零退出状态的命令。但是,您的函数不能返回非零退出状态:

    #!/bin/bash
    set -o errexit
    
    function mygrep {
        local rc=0
        # on the left side of ||, errexit not triggered
        grep "$@" >/dev/null || rc=$?
    #     return $rc         # nope, will trigger errexit
        echo $rc
    }
    
    echo "test 1: exit status 0"
    mygrep $USER /etc/passwd
    
    echo "test 2: exit status 1"
    mygrep foobarbaz /etc/passwd
    
    echo "test 2: exit status 2"
    mygrep $USER /file_does_not_exist
    
    echo done
    

    输出

    test 1: exit status 0
    0
    test 2: exit status 1
    1
    test 2: exit status 2
    grep: /file_does_not_exist: No such file or directory
    2
    done
    

    【讨论】:

    • 禁用已启用的功能不是解决方案。我必须一直设置 -o errexit
    • 那么你永远无法保护自己免受非零退出状态的影响。不要调用 grep 或 diff。
    • 我不想保护自己免受非零状态的影响,这不是重点。我想知道如何退出已设置 -o errexit 的函数的状态
    • 你不能。阅读set -e 的文档:“如果 [...] 作为由大括号括起来的命令列表的一部分执行的命令之一以非零状态退出,则立即退出。”函数是大括号中的命令列表。
    • 其实会有办法的。我必须跑步,但我稍后会回到这个。
    猜你喜欢
    • 2016-09-05
    • 2018-04-17
    • 1970-01-01
    • 2010-09-13
    • 2021-06-24
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多