6

我正在编写一个简单的程序,它解析编译器的输出并重新格式化任何错误消息,以便我们使用的 IDE(visual studio)可以解析它们。我们nmake用来构建,它会使用这样的命令行调用编译器:

cc166.exe SOME_FLAGS_HERE MyCFile.c 2>&1 | TaskingVXToVisualReformat.exe

现在的问题是编译器的返回码 ,cc166没有反馈给nmake. 仅使用我的重新格式化程序的返回码,这意味着如果我从重新格式化程序返回零,nmake 将继续构建而不是中止。如何将编译器 ( cc166.exe) 的返回码反馈给nmake?

我的重新格式化程序有什么办法可以读取编译器的返回码并在决定自己的返回码时使用它?重新格式化程序是用 C# 编写的。

4

2 回答 2

2

我会将编译指令放在 bash 脚本中,并利用它的 pipefail 功能:

管道的退出状态是管道中最后一个命令的退出状态,除非启用了 pipefail 选项。如果启用了 pipefail,则管道的返回状态是最后一个(最右边)以非零状态退出的命令的值,如果所有命令都成功退出,则返回零。

让我们通过一个简单的测试来尝试一下:

$ cat bash_pipe.sh
#!/bin/bash
set -o pipefail
ls $1 2>&1 | perl -ne '{print;}'

如果我们使用现有文件运行它,退出代码将为 0(通过管道传递):

$ ./bash_pipe.sh bash_pipe.sh 
bash_pipe.sh
$ echo $?
0

另一方面,命令因文件不存在而失败:

./bash_pipe.sh inexistent
ls: cannot access inexistent: No such file or directory
echo $?
2

因此,在您的情况下,您需要将编译说明放在脚本中,例如

$ cat compilation_script.sh
#!/bin/bash
set -o pipefail
cc166.exe SOME_FLAGS_HERE $1 2>&1 | TaskingVXToVisualReformat.exe

并直接(如果可以的话)或通过间接调用它

bash -c "compilation_script.sh MyCFile.c"

注意:在 bash 版本 3 中引入了 pipefail 选项。

于 2014-11-17T15:30:28.507 回答
0

您可以将单个命令一分为二,并将编译结果保存在临时文件中:

cc166.exe SOME_FLAGS_HERE MyCFile.c > CCRESULT.TXT 2>&1
if not errorlevel 1 TaskingVXToVisualReformat.exe < CCRESULT.TXT
于 2011-05-09T11:23:42.103 回答