在makefile中处理管道及其退出状态的最佳方法

 宋羽翔-ben 发布于 2022-12-28 12:23

如果命令失败make,例如gcc,它退出...

gcc
gcc: fatal error: no input files
compilation terminated.
make: *** [main.o] Error 4

但是,如果我有一个管道,则会获取管道中最后一个命令的退出状态.举个例子,gcc | cat因为cat成功不会失败.

我知道整个管道的退出代码存储在PIPESTATUS数组中,我可以得到错误代码4 ${PIPESTATUS[0]}.我应该如何构建我的makefile来处理管道命令并在正常情况下退出失败?


在评论中,另一个例子是gcc | grep something.在这里,我假设最理想的行为仍然是,gcc并且只会gcc导致失败,而不是grep如果它没有找到任何东西.

2 个回答
  • 你应该能够告诉make使用bash,而不是sh和让bashset -o pipefail设定,因此在管道中的第一次失败退出.

    GNU Make3.81(并且可能更早,虽然我不确定)你应该能够做到这一点SHELL = /bin/bash -o pipefail.

    GNU Make3.82(及更新版本)中,您应该可以使用SHELL = /bin/bash.SHELLFLAGS = -o pipefail -c(虽然我不知道是否需要添加-c到最后,或者即使指定时make也会为您添加.SHELLFLAGS.

    bash手册页:

    除非启用了pipefail选项,否则管道的返回状态是最后一个命令的退出状态.如果启用了pipefail,则管道的返回状态是以非零状态退出的最后(最右侧)命令的值,如果所有命令都成功退出,则返回零.如果保留字!在管道之前,该管道的退出状态是如上所述的退出状态的逻辑否定.shell在返回值之前等待管道中的所有命令终止.

    2022-12-28 12:25 回答
  • 我会去的pipefail.但是如果你真的不想要(或者如果你只想在第一个进程中失败 - 不管其他管道出现故障):

    SHELL=bash
    
    all:
            gcc | cat ; exit "$${PIPESTATUS[0]}"
    

    与@jozxyqk自我回答相比,唯一的优点是您不会丢失退出状态代码.

    2022-12-28 12:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有