如何在 Makefile 中设置 pipefail

now*_*wox 4 error-handling makefile pipe

考虑这个 Makfile:

all: 
    test 1 -eq 2 | cat
    echo 'done'
Run Code Online (Sandbox Code Playgroud)

它将被执行而不会出错。

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

all: 
    set -o pipefail;     \
    test 1 -eq 2 | cat;  \
    echo 'done'
Run Code Online (Sandbox Code Playgroud)

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

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

我可以使用什么其他解决方案?

小智 17

您可以将 pipefail 作为 make 的 SHELL 调用的一部分从GNU make 中的 pipefail 的等效项中强制打开?

SHELL=/bin/bash -o pipefail
Run Code Online (Sandbox Code Playgroud)


l0b*_*0b0 3

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

Makefile

all:
    ./my.sh
Run Code Online (Sandbox Code Playgroud)

my.sh

#!/usr/bin/env bash
set -o errexit -o pipefail
test 1 -eq 2 | cat
echo 'done'
Run Code Online (Sandbox Code Playgroud)

也就是说,像您这样的 Makefile 命令块的退出代码是最后一个命令的退出代码,因为您用 . 分隔命令;您只能使用&&来执行,直到出现错误(相当于errexit),如下所示:

set -o pipefail && test 1 -eq 2 | cat && echo 'done'
Run Code Online (Sandbox Code Playgroud)