grep 获取编译错误

grep 获取编译错误

我创建了一个简单的 c 程序,并故意省略了 ';' 以导致错误。我想使用 grep 命令来知道编译是否成功。

我用:

gcc test.c | grep 'error'但输出似乎不正确。这是正确的方法吗?

我认为它不起作用,因为这样做:

回声"hello world" | grep "hello"我得到了匹配的彩色文本。

当执行 grep 进行编译时,没有这样的事情。

错误形式如下:

test.c: In function ‘main’:
test.c:8:2: error: expected ‘,’ or ‘;’ before ‘return’
  return 0;
  ^

我使用的程序是:

int main(int argc, char const *argv[]){
    char f[] = "Hello thereeee!" 
    return 0;
}

答案1

如果你想知道一个命令是成功还是失败,通常必须检查其退出代码。零表示成功,非零表示失败。

shell 中的示例:

gcc foo.c
rc=$?  # Store exit code for later use
if [ $rc -ne 0 ]; then  # $rc not equal to zero
    echo "gcc exited with $rc"
fi

您还可以分别使用&&||来在成功或失败时执行命令:

gcc foo.c && echo gcc succeeded
gcc foo.c || echo gcc failed

正如评论中提到的,gcc foo.c | grep error没有捕获所有内容,因为管道通常仅捕获标准输出 (stdout)。程序通常会将异常消息输出到标准错误 (stderr)。要捕获该流,您必须在管道传输到之前将 stderr 重定向到 stdout grep

gcc foo.c 2>&1 | grep error

或者,如果您使用bashshell,您可以使用这个简写:

gcc foo.c |& grep error

现在,这gcc将生成一个a.out二进制文件。如果您只想检查语法错误,可以使用gcc -fsyntax-only foo.c。然后,您可以检查输出或检查其退出代码是否存在错误。

答案2

muru 在评论中解决了这个问题:

您应该 grepping stderr:

gcc ... |& grep.

– 穆鲁

相关内容