检查 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
我的脚本包含以下集合:
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