如果找到则让 grep exit 1,如果没有找到则退出 0

如果找到则让 grep exit 1,如果没有找到则退出 0

我正在创建一个在 GitHub Actions 中执行的简单命令,该命令构建一个 Makefile 并在找到(匹配)时返回错误Error 1,在未找到时返回成功...

我似乎要么让它失败,即使没有任何问题,要么当有问题时不失败。

这是我的整个命令:

find . -name "Makefile" -exec sh -c 'cd "$(dirname "$0")" && make' {} \; | grep -zqvE "Error 1"

exit 1如果它找到这样的输出,我希望它:

ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [compile] Error 1

或者0其他情况

答案1

! find ...as in the question... | grep -qF 'Error 1'

初始!导致管道的退出状态被否定。管道的退出状态是命令的退出状态,如果在命令的输出中找到grep该字符串,则该退出状态为零。Error 1find

因此,如果Error 1在输出中找到,grep则以零退出状态退出,并将!其反转为非零值。

请注意,make可能会将诊断消息写入其标准错误流,在这种情况下,您必须使用以下命令重定向输出2>&1

! find ...as in the question... 2>&1 | grep -qF 'Error 1'

另请注意,grep一旦找到匹配项就会终止,find一旦尝试写入死管道,就会由于接收到 SIGPIPE 信号而终止。


您尝试使用grepwith -v。您可以将其视为-v问题“是否有与此模式不匹配的行?”。在这种情况下,有将要是行不匹配Error 1,无论是否Error 1发生。

相关内容