考虑一下此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'