grep 得到编译错误

bil*_*pcs 1 command-line compiling grep

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

我用:

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

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

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

在为编译做 grep 时,没有这样的事情。

错误具有以下形式:

test.c: In function ‘main’:
test.c:8:2: error: expected ‘,’ or ‘;’ before ‘return’
  return 0;
  ^
Run Code Online (Sandbox Code Playgroud)

我使用的程序是:

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

Lek*_*eyn 6

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

外壳示例:

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
Run Code Online (Sandbox Code Playgroud)

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

gcc foo.c && echo gcc succeeded
gcc foo.c || echo gcc failed
Run Code Online (Sandbox Code Playgroud)

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

gcc foo.c 2>&1 | grep error
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用bashshell,则可以使用以下简写:

gcc foo.c |& grep error
Run Code Online (Sandbox Code Playgroud)

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