【发布时间】:2016-02-28 18:36:15
【问题描述】:
考虑这个 Makfile:
all:
test 1 -eq 2 | cat
echo 'done'
它将被正确执行。
我听说过set -o pipefail,我可以这样使用:
all:
set -o pipefail; \
test 1 -eq 2 | cat; \
echo 'done'
除了它不起作用之外,这种写作非常痛苦。
另一种解决方案是使用临时文件。我想避免它。
我还可以使用什么其他解决方案?
【问题讨论】:
-
第二个 sn-p 怎么不起作用?它应该可以正常工作(
cat显然在那里毫无意义)。还是您的意思是它不会阻止done被回显?它没有这样做,因为没有任何东西告诉 shell 停止执行。这里只有一行而不是多行,因此 make 不能因test失败而终止(即使它传播到| cat之后)。删除; ` betweencat` 和echo,它会如你所愿。 -
我的
GNU Make 4.1没有任何错误 -
使用您的示例代码,您不应该得到任何错误。
test失败只是被忽略了。什么都看不到。您期望 make 看到它并使配方失败,但这仅发生在 entire 命令的返回码(通常是单行,但在您的情况下是串联的三行)。 -
在我的用例中,我使用的是自制的 cksum 脚本,我通过管道将其输入
dd -of=$@ -seek=$$(( $$(stat -c %s $@) - 4 ))。如果 cksum 失败,dd 也应该失败,我不应该执行其余的命令。 -
或者使用两行
set -o pipefail; \ cksum ... | dd ... || exit 1和echo done而不将它们合并在一起。
标签: error-handling makefile pipe