如何在Makefile中设置pipefail

时间:2015-11-25 20:08:03

标签: error-handling makefile pipe

考虑一下这个Makfile:

all: 
    test 1 -eq 2 | cat
    echo 'done'

执行时没有错误。

我听说set -o pipefail我可以这样使用:

all: 
    set -o pipefail;     \
    test 1 -eq 2 | cat;  \
    echo 'done'

除了它不起作用外,这篇文章非常痛苦。

另一种解决方案是使用临时文件。我想避免它。

我可以使用哪种其他解决方案?

2 个答案:

答案 0 :(得分:3)

您可以在make的SHELL调用中强制启用pipefail 来自equivalent of pipefail in GNU make?

SHELL=/bin/bash -o pipefail

答案 1 :(得分:2)

对于比单个命令更复杂的事情,我通常更喜欢使用脚本。这样你就完全控制了解释器(通过shebang line),你可以将更复杂的命令放在一起,而不是试图将它变成有效的单行。例如:

Makefile

all:
    ./my.sh

my.sh

#!/usr/bin/env bash
set -o errexit -o pipefail
test 1 -eq 2 | cat
echo 'done'

那就是说, Makefile命令块的退出代码就像你拥有的那样是 last 命令的退出代码,因为你将命令与;分开。 / strong>您可以使用&&执行,直到您收到错误(相当于errexit),如下所示:

set -o pipefail && test 1 -eq 2 | cat && echo 'done'