2014-10-28 48 views
2

我想使用一个小脚本对我的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会在错误的情况下不会正确地停止构建过程。

我该如何做到这一点?

回答

1

尝试使用子壳:

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

(cmd)结构用于在一个子shell启动cmd。您当前的shell将自行分叉,并且这些命令将由子shell执行。这是一个简单的方法来运行多个命令并将输出提供给管道。

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

cmd1 |& cmd1构造相当于cmd1 2>&1 | cmd2

0

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