跨管道传播退出状态

Posted

技术标签:

【中文标题】跨管道传播退出状态【英文标题】: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 将不会在出现错误时正确停止构建过程。

我怎样才能做到这一点?

【问题讨论】:

【参考方案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 脚本返回该值。

【讨论】:

以上是关于跨管道传播退出状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在 getline 管道中获取命令的退出状态?

如何获取管道中第一个命令的退出状态? [复制]

从最后一个管道(stdin)获取退出代码

Bash pipe:获取管道中前一个进程的退出状态

退出管道工作而不会失败

管道进入 grep -v 时获取退出代码 [重复]