考虑一下此Makfile:

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

它将被正确执行。

我听说过set -o pipefail可能会这样使用:
all:
    set -o pipefail;     \
    test 1 -eq 2 | cat;  \
    echo 'done'

除了它不起作用之外,本文还是很痛苦的。

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

我还能使用什么其他解决方案?

最佳答案

对于比单个命令更复杂的事情,我通常更喜欢使用脚本。这样,您就可以完全控制解释器(通过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命令块的退出代码,这是最后一个命令的退出代码,因为您用;分隔了命令。 您可以使用&&仅在出现错误之前执行(等同于errexit),如下所示:
set -o pipefail && test 1 -eq 2 | cat && echo 'done'

07-26 09:34