我想用一个小脚本为我的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会在发生错误时无法正确停止构建过程。
我怎样才能做到这一点?
答案 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脚本返回该值。