【问题标题】:Propagate exit status across pipes跨管道传播退出状态
【发布时间】:2014-10-28 10:40:12
【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: perl pipe exit-code


    【解决方案1】:

    尝试使用子外壳:

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

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

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

    cmd1 |&amp; cmd1 构造等价于 cmd1 2&gt;&amp;1 | cmd2

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-15
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        相关资源
        最近更新 更多