考虑一下这个Makfile:
all:
test 1 -eq 2 | cat
echo 'done'
执行时没有错误。
我听说set -o pipefail
我可以这样使用:
all:
set -o pipefail; \
test 1 -eq 2 | cat; \
echo 'done'
除了它不起作用外,这篇文章非常痛苦。
另一种解决方案是使用临时文件。我想避免它。
我可以使用哪种其他解决方案?
答案 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'