传播管道的退出状态

时间:2014-10-28 10:40:13

标签: perl pipe exit-code

我想用一个小脚本为我的gcc输出做一些整容工作。

所以我使用这个命令:

 mygcc foo.c 2>&1 | myscript.pl

基本上我的脚本做了这样的事情:

$error = 0;
while(<>)
{
    s/^"(.*)"\s*,\s*line\s*(\d+)\s*:\s*(cc\d+)\s*:/colored("[$3]", 'bold red').colored(" $1", 'red').":".colored("$2", 'yellow')/ge;
    s/ \^/colored(" ^", 'yellow')/e;
    s/(error:.*$)/colored($1, 'red')/ge;
    s/(warning.*$)/colored($1, 'yellow')/ge;
    print;
    $error = -1;
}    

不幸的是,gcc的退出代码没有通过管道正确传播。我需要做的是从gcc获取退出代码并从我的脚本中写回来。

如果没有这个,make会在发生错误时无法正确停止构建过程。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

尝试使用子shell:

( mygcc foo.c; echo "gcc returned $?" ) |& myscript.pl

( cmd )构造用于在子shell中启动cmd。您当前的shell将自行分叉,命令将由子shell执行。这是一种运行多个命令并将输出馈送到管道的简单方法。

$?变量是最后一个命令的退出状态。

cmd1 |& cmd1构造等同于cmd1 2>&1 | cmd2

答案 1 :(得分:0)

看看this。然后,您可以使用%ENV变量访问gcc返回状态,并从perl脚本返回该值。