grep 错误但没有错误消息

use*_*629 5 bash grep

我有一个(长)Bash 脚本,它执行如下操作:

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

echo -e "foo \n bar" | grep "baz" | tr -d ' '

echo "here"
Run Code Online (Sandbox Code Playgroud)

该脚本失败且没有错误消息,因为 grep 命令返回错误 1 ​​且不打印任何错误消息。

如何使我的脚本健壮?

dev*_*ull 1

grep如果模式无法匹配,将产生非零退出代码。而且,它不会产生任何错误消息。为了在输入中找不到模式时获取错误消息,您需要替代方案。您可能会使用awk

echo -e "foo \n bar" | \
awk 'BEGIN{f=0}/baz/{f=1;print;}END{if (!f) {print "Error; string not found"; exit 1;}}' | \
tr -d ' '
Run Code Online (Sandbox Code Playgroud)

这将表现得非常类似于grep(就退出代码而言),并且如果未找到匹配,则会产生错误消息。

为了将错误消息输出到STDERR,您可以说:

echo -e "foo \n bar" | \
awk 'BEGIN{f=0}/baz/{f=1;print;}END{if (!f) {print "Error; string not found" > "/dev/stderr"; exit 1;}}' | \
tr -d ' '
Run Code Online (Sandbox Code Playgroud)