检查 grep return 代码

Check grep return code

我的脚本包含以下集合:

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

现在我想对文件 b 中的字母 A 进行 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 失败)会很好。我该怎么做?

我不明白这如何保护你免受 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 的文档,您可以在某些情况下处理具有非零退出状态的命令。但是,您的函数不能 return 非零退出状态:

#!/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