【发布时间】:2014-08-14 11:18:48
【问题描述】:
如果make中的命令失败,例如gcc,则退出...
gcc
gcc: fatal error: no input files
compilation terminated.
make: *** [main.o] Error 4
但是,如果我有一个管道,则会采用管道中最后一个命令的退出状态。例如,gcc | cat 不会因为cat 成功而失败。
我知道整个管道的退出代码存储在 PIPESTATUS 数组中,我可以使用 ${PIPESTATUS[0]} 获得错误代码 4。我应该如何构建我的 makefile 以处理管道命令并正常退出失败?
在 cmets 中,另一个例子是 gcc | grep something。在这里,我假设最想要的行为仍然是 gcc 并且只有 gcc 会导致失败,而不是 grep 如果它没有找到任何东西。
【问题讨论】:
-
退后一步,你能完全避开管道吗?
-
@chepner 这可能吗?我想不出不使用临时文件或命名管道的方法。
cat <( gcc )仍然有同样的问题。 -
我虽然
gcc | cat只是一个例子;我想不出任何理由来实际这样做。如果您需要将输出保存在其他地方,gcc > ....应该可以工作。如果cat是更复杂命令的占位符,可能还有其他选项。 -
@chepner 是的,
gcc | grep error或其他可能是更好的例子。 -
如果您希望构建过程在
gcc失败时中止,我只需将其输出/错误重定向到一个文件,然后仅在gcc成功时处理该文件。仅仅因为你可以使用管道并不意味着你应该。