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)
对于比单个命令更复杂的事情,我通常更喜欢使用脚本。这样你就可以完全控制解释器(通过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)
| 归档时间: |
|
| 查看次数: |
2338 次 |
| 最近记录: |