如何在管道命令行中使用第一个程序的返回码

时间:2011-05-09 07:59:24

标签: pipe errorlevel

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

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

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

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

2 个答案:

答案 0 :(得分: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"

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

答案 1 :(得分:0)

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

cc166.exe SOME_FLAGS_HERE MyCFile.c > CCRESULT.TXT 2>&1
if not errorlevel 1 TaskingVXToVisualReformat.exe < CCRESULT.TXT