我的脚本包含以下设置:
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失败)会很好。我怎么能这样做?
答案 0 :(得分:2)
我看不出它如何保护您免受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